xprtrdma: Fix additional uses of spin_lock_irqsave(rb_lock)
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: f531a5dbc4
('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>
This commit is contained in:
parent
abfb689711
commit
9b06688bc3
@ -84,9 +84,7 @@ out_fail:
|
|||||||
static int rpcrdma_bc_setup_reps(struct rpcrdma_xprt *r_xprt,
|
static int rpcrdma_bc_setup_reps(struct rpcrdma_xprt *r_xprt,
|
||||||
unsigned int count)
|
unsigned int count)
|
||||||
{
|
{
|
||||||
struct rpcrdma_buffer *buffers = &r_xprt->rx_buf;
|
|
||||||
struct rpcrdma_rep *rep;
|
struct rpcrdma_rep *rep;
|
||||||
unsigned long flags;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
@ -98,9 +96,7 @@ static int rpcrdma_bc_setup_reps(struct rpcrdma_xprt *r_xprt,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&buffers->rb_lock, flags);
|
rpcrdma_recv_buffer_put(rep);
|
||||||
list_add(&rep->rr_list, &buffers->rb_recv_bufs);
|
|
||||||
spin_unlock_irqrestore(&buffers->rb_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -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_ia *ia = &r_xprt->rx_ia;
|
||||||
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
|
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
|
||||||
struct rpcrdma_rep *rep;
|
struct rpcrdma_rep *rep;
|
||||||
unsigned long flags;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
spin_lock_irqsave(&buffers->rb_lock, flags);
|
spin_lock(&buffers->rb_lock);
|
||||||
if (list_empty(&buffers->rb_recv_bufs))
|
if (list_empty(&buffers->rb_recv_bufs))
|
||||||
goto out_reqbuf;
|
goto out_reqbuf;
|
||||||
rep = rpcrdma_buffer_get_rep_locked(buffers);
|
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);
|
rc = rpcrdma_ep_post_recv(ia, ep, rep);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -1356,7 +1355,7 @@ rpcrdma_ep_post_extra_recv(struct rpcrdma_xprt *r_xprt, unsigned int count)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_reqbuf:
|
out_reqbuf:
|
||||||
spin_unlock_irqrestore(&buffers->rb_lock, flags);
|
spin_unlock(&buffers->rb_lock);
|
||||||
pr_warn("%s: no extra receive buffers\n", __func__);
|
pr_warn("%s: no extra receive buffers\n", __func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user