• J. Bruce Fields's avatar
    svcrpc: fix unlikely races preventing queueing of sockets · 95503d29
    J. Bruce Fields authored
    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: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    95503d29
svc_xprt.c 37.8 KB