diff options
author | Neil Brown <neilb@suse.de> | 2010-03-01 16:51:14 +1100 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2010-05-03 08:33:00 -0400 |
commit | b48fa6b99100dc7772af3cd276035fcec9719ceb (patch) | |
tree | 415dba87c6c5de0ab85a8493f864838f4f3cc005 /net/sunrpc/svc_xprt.c | |
parent | 26c0c75e69265961e891ed80b38fb62a548ab371 (diff) | |
download | op-kernel-dev-b48fa6b99100dc7772af3cd276035fcec9719ceb.zip op-kernel-dev-b48fa6b99100dc7772af3cd276035fcec9719ceb.tar.gz |
sunrpc: centralise most calls to svc_xprt_received
svc_xprt_received must be called when ->xpo_recvfrom has finished
receiving a message, so that the XPT_BUSY flag will be cleared and
if necessary, requeued for further work.
This call is currently made in each ->xpo_recvfrom function, often
from multiple different points. In each case it is the earliest point
on a particular path where it is known that the protection provided by
XPT_BUSY is no longer needed.
However there are (still) some error paths which do not call
svc_xprt_received, and requiring each ->xpo_recvfrom to make the call
does not encourage robustness.
So: move the svc_xprt_received call to be made just after the
call to ->xpo_recvfrom(), and move it of the various ->xpo_recvfrom
methods.
This means that it may not be called at the earliest possible instant,
but this is unlikely to be a measurable performance issue.
Note that there are still other calls to svc_xprt_received as it is
also needed when an xprt is newly created.
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r-- | net/sunrpc/svc_xprt.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index c334f54..75f9aa2 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -743,8 +743,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) if (rqstp->rq_deferred) { svc_xprt_received(xprt); len = svc_deferred_recv(rqstp); - } else + } else { len = xprt->xpt_ops->xpo_recvfrom(rqstp); + svc_xprt_received(xprt); + } dprintk("svc: got len=%d\n", len); } |