summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2003-08-18 19:34:08 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-08-18 19:34:08 -0700
commite8f3645cc9f2fb613e07a9b50df4518a9387596e (patch)
tree43101f6c388427a3572fb3ccc36c8a7a0fc30c7b /net
parentb50ca02ac68265ffb102f7c9da13e429c7fb8f13 (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.c13
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;
}