svcrdma: Fix race between svc_rdma_recvfrom thread and the dto_tasklet
authorTom Tucker <tom@opengridcomputing.com>
Wed, 13 Aug 2008 16:05:41 +0000 (11:05 -0500)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Wed, 13 Aug 2008 20:57:31 +0000 (16:57 -0400)
commit24b8b44780a2c53ecb738f4a1c08d114f5eda27c
treef772e59438783c6230158ea65bd5aeb3f84f4202
parent30a2f3c60a84092c8084dfe788b710f8d0768cd4
svcrdma: Fix race between svc_rdma_recvfrom thread and the dto_tasklet

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: Tom Tucker <tom@opengridcomputing.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_transport.c