IB/rdmavt: add lock to call to rvt_error_qp to prevent a race condition
[ Upstream commit4d809f6969] The documentation of the function rvt_error_qp says both r_lock and s_lock need to be held when calling that function. It also asserts using lockdep that both of those locks are held. However, the commit I referenced in Fixes accidentally makes the call to rvt_error_qp in rvt_ruc_loopback no longer covered by r_lock. This results in the lockdep assertion failing and also possibly in a race condition. Fixes:d757c60eca("IB/rdmavt: Fix concurrency panics in QP post_send and modify to error") Link: https://lore.kernel.org/r/20220228165330.41546-1-dossche.niels@gmail.com Signed-off-by: Niels Dossche <dossche.niels@gmail.com> Acked-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3a57babfb6
commit
43c2d7890e
1 changed files with 5 additions and 1 deletions
|
|
@ -3241,7 +3241,11 @@ serr_no_r_lock:
|
|||
spin_lock_irqsave(&sqp->s_lock, flags);
|
||||
rvt_send_complete(sqp, wqe, send_status);
|
||||
if (sqp->ibqp.qp_type == IB_QPT_RC) {
|
||||
int lastwqe = rvt_error_qp(sqp, IB_WC_WR_FLUSH_ERR);
|
||||
int lastwqe;
|
||||
|
||||
spin_lock(&sqp->r_lock);
|
||||
lastwqe = rvt_error_qp(sqp, IB_WC_WR_FLUSH_ERR);
|
||||
spin_unlock(&sqp->r_lock);
|
||||
|
||||
sqp->s_flags &= ~RVT_S_BUSY;
|
||||
spin_unlock_irqrestore(&sqp->s_lock, flags);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue