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