xprtrdma: Fix additional uses of spin_lock_irqsave(rb_lock)
authorChuck Lever <chuck.lever@oracle.com>
Wed, 16 Dec 2015 22:22:06 +0000 (17:22 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 18 Dec 2015 20:34:33 +0000 (15:34 -0500)
Clean up.

rb_lock critical sections added in rpcrdma_ep_post_extra_recv()
should have first been converted to use normal spin_lock now that
the reply handler is a work queue.

The backchannel set up code should use the appropriate helper
instead of open-coding a rb_recv_bufs list add.

Problem introduced by glib patch re-ordering on my part.

Fixes: f531a5dbc451 ('xprtrdma: Pre-allocate backward rpc_rqst')
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Devesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/backchannel.c
net/sunrpc/xprtrdma/verbs.c

index 97554ca..40f48c6 100644 (file)
@@ -84,9 +84,7 @@ out_fail:
 static int rpcrdma_bc_setup_reps(struct rpcrdma_xprt *r_xprt,
                                 unsigned int count)
 {
-       struct rpcrdma_buffer *buffers = &r_xprt->rx_buf;
        struct rpcrdma_rep *rep;
-       unsigned long flags;
        int rc = 0;
 
        while (count--) {
@@ -98,9 +96,7 @@ static int rpcrdma_bc_setup_reps(struct rpcrdma_xprt *r_xprt,
                        break;
                }
 
-               spin_lock_irqsave(&buffers->rb_lock, flags);
-               list_add(&rep->rr_list, &buffers->rb_recv_bufs);
-               spin_unlock_irqrestore(&buffers->rb_lock, flags);
+               rpcrdma_recv_buffer_put(rep);
        }
 
        return rc;
index 2cc1014..0036307 100644 (file)
@@ -1338,15 +1338,14 @@ rpcrdma_ep_post_extra_recv(struct rpcrdma_xprt *r_xprt, unsigned int count)
        struct rpcrdma_ia *ia = &r_xprt->rx_ia;
        struct rpcrdma_ep *ep = &r_xprt->rx_ep;
        struct rpcrdma_rep *rep;
-       unsigned long flags;
        int rc;
 
        while (count--) {
-               spin_lock_irqsave(&buffers->rb_lock, flags);
+               spin_lock(&buffers->rb_lock);
                if (list_empty(&buffers->rb_recv_bufs))
                        goto out_reqbuf;
                rep = rpcrdma_buffer_get_rep_locked(buffers);
-               spin_unlock_irqrestore(&buffers->rb_lock, flags);
+               spin_unlock(&buffers->rb_lock);
 
                rc = rpcrdma_ep_post_recv(ia, ep, rep);
                if (rc)
@@ -1356,7 +1355,7 @@ rpcrdma_ep_post_extra_recv(struct rpcrdma_xprt *r_xprt, unsigned int count)
        return 0;
 
 out_reqbuf:
-       spin_unlock_irqrestore(&buffers->rb_lock, flags);
+       spin_unlock(&buffers->rb_lock);
        pr_warn("%s: no extra receive buffers\n", __func__);
        return -ENOMEM;