• Tom Tucker's avatar
    svcrdma: Fix race between svc_rdma_recvfrom thread and the dto_tasklet · 24b8b447
    Tom Tucker authored
    RDMA_READ completions are kept on a separate queue from the general
    I/O request queue. Since a separate lock is used to protect the RDMA_READ
    completion queue, a race exists between the dto_tasklet and the
    svc_rdma_recvfrom thread where the dto_tasklet sets the XPT_DATA
    bit and adds I/O to the read-completion queue. Concurrently, the
    recvfrom thread checks the generic queue, finds it empty and resets
    the XPT_DATA bit. A subsequent svc_xprt_enqueue will fail to enqueue
    the transport for I/O and cause the transport to "stall".
    
    The fix is to protect both lists with the same lock and set the XPT_DATA
    bit with this lock held.
    Signed-off-by: default avatarTom Tucker <tom@opengridcomputing.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
    24b8b447
svc_rdma_transport.c 31.5 KB