diff options
| author | Neil Brown <neilb@cse.unsw.edu.au> | 2003-08-18 19:34:08 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-08-18 19:34:08 -0700 |
| commit | e8f3645cc9f2fb613e07a9b50df4518a9387596e (patch) | |
| tree | 43101f6c388427a3572fb3ccc36c8a7a0fc30c7b /net | |
| parent | b50ca02ac68265ffb102f7c9da13e429c7fb8f13 (diff) | |
[PATCH] kNFSd: Release udp socket for next nfs request to arrive earlier
From: Mark Hemment <markhe@veritas.com>
For RPC over UDP, after receiving a packet kick another thread as soon
as possible. This helps NFS performance.
Diffstat (limited to 'net')
| -rw-r--r-- | net/sunrpc/svcsock.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 552fa2c31b39..46a728df6693 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -592,8 +592,14 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) /* possibly an icmp error */ dprintk("svc: recvfrom returned error %d\n", -err); } + svsk->sk_sk->sk_stamp = skb->stamp; set_bit(SK_DATA, &svsk->sk_flags); /* there may be more data... */ + /* + * Maybe more packets - kick another thread ASAP. + */ + svc_sock_received(svsk); + len = skb->len - sizeof(struct udphdr); rqstp->rq_arg.len = len; @@ -605,8 +611,6 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr; rqstp->rq_daddr = skb->nh.iph->daddr; - svsk->sk_sk->sk_stamp = skb->stamp; - if (skb_is_nonlinear(skb)) { /* we have to copy */ local_bh_disable(); @@ -614,7 +618,6 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) local_bh_enable(); /* checksum error */ skb_free_datagram(svsk->sk_sk, skb); - svc_sock_received(svsk); return 0; } local_bh_enable(); @@ -626,7 +629,6 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) if (skb->ip_summed != CHECKSUM_UNNECESSARY) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) { skb_free_datagram(svsk->sk_sk, skb); - svc_sock_received(svsk); return 0; } skb->ip_summed = CHECKSUM_UNNECESSARY; @@ -646,9 +648,6 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) if (serv->sv_stats) serv->sv_stats->netudpcnt++; - /* One down, maybe more to go... */ - svc_sock_received(svsk); - return len; } |
