OSDN Git Service

svcrpc: fix unlikely races preventing queueing of sockets
authorJ. Bruce Fields <bfields@redhat.com>
Fri, 11 Jan 2019 20:36:40 +0000 (15:36 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 6 Feb 2019 20:37:14 +0000 (15:37 -0500)
commit95503d295ad6af20f09efff193e085481a962fd2
treea580f60a4a517c73575705c1745de208840f1c43
parent66c898caefd346a88fbef242eb7892fd959308f6
svcrpc: fix unlikely races preventing queueing of sockets

In the rpc server, When something happens that might be reason to wake
up a thread to do something, what we do is

- modify xpt_flags, sk_sock->flags, xpt_reserved, or
  xpt_nr_rqsts to indicate the new situation
- call svc_xprt_enqueue() to decide whether to wake up a thread.

svc_xprt_enqueue may require multiple conditions to be true before
queueing up a thread to handle the xprt.  In the SMP case, one of the
other CPU's may have set another required condition, and in that case,
although both CPUs run svc_xprt_enqueue(), it's possible that neither
call sees the writes done by the other CPU in time, and neither one
recognizes that all the required conditions have been set.  A socket
could therefore be ignored indefinitely.

Add memory barries to ensure that any svc_xprt_enqueue() call will
always see the conditions changed by other CPUs before deciding to
ignore a socket.

I've never seen this race reported.  In the unlikely event it happens,
another event will usually come along and the problem will fix itself.
So I don't think this is worth backporting to stable.

Chuck tried this patch and said "I don't see any performance
regressions, but my server has only a single last-level CPU cache."

Tested-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/svc_xprt.c
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_rw.c