svcrdma: Shrink scope of spinlock on RQ CQ
authorTom Tucker <tom@opengridcomputing.com>
Tue, 6 May 2008 16:49:05 +0000 (11:49 -0500)
committerTom Tucker <tom@opengridcomputing.com>
Mon, 19 May 2008 12:33:53 +0000 (07:33 -0500)
The rq_cq_reap function is only called from the dto_tasklet. The
only resource shared with other threads is the sc_rq_dto_q. Move the
spin lock to protect only this list.

Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
net/sunrpc/xprtrdma/svc_rdma_transport.c

index 817cf4d..78303f0 100644 (file)
@@ -292,7 +292,6 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt)
        ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP);
        atomic_inc(&rdma_stat_rq_poll);
 
-       spin_lock_bh(&xprt->sc_rq_dto_lock);
        while ((ret = ib_poll_cq(xprt->sc_rq_cq, 1, &wc)) > 0) {
                ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id;
                ctxt->wc_status = wc.status;
@@ -303,9 +302,10 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt)
                        svc_rdma_put_context(ctxt, 1);
                        continue;
                }
+               spin_lock_bh(&xprt->sc_rq_dto_lock);
                list_add_tail(&ctxt->dto_q, &xprt->sc_rq_dto_q);
+               spin_unlock_bh(&xprt->sc_rq_dto_lock);
        }
-       spin_unlock_bh(&xprt->sc_rq_dto_lock);
 
        if (ctxt)
                atomic_inc(&rdma_stat_rq_prod);