summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2019-01-11 15:36:40 -0500
committerJ. Bruce Fields <bfields@redhat.com>2019-02-06 15:37:14 -0500
commit95503d295ad6af20f09efff193e085481a962fd2 (patch)
treea580f60a4a517c73575705c1745de208840f1c43 /sound
parent66c898caefd346a88fbef242eb7892fd959308f6 (diff)
downloadlinux-95503d295ad6af20f09efff193e085481a962fd2.tar.bz2
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>
Diffstat (limited to 'sound')
0 files changed, 0 insertions, 0 deletions