瀏覽代碼

IB/hfi1: Fix missing lock/unlock in verbs drain callback

The iowait_sdma_drained() callback lacked locking to
protect the qp s_flags field.

This causes the s_flags to be out of sync
on multiple CPUs, potentially corrupting the s_flags.

Fixes: a545f5308b6c ("staging/rdma/hfi: fix CQ completion order issue")
Reviewed-by: Sebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Mike Marciniszyn 9 年之前
父節點
當前提交
b9b06cb6fe
共有 1 個文件被更改,包括 2 次插入0 次删除
  1. 2 0
      drivers/staging/rdma/hfi1/qp.c

+ 2 - 0
drivers/staging/rdma/hfi1/qp.c

@@ -519,10 +519,12 @@ static void iowait_sdma_drained(struct iowait *wait)
 	 * do the flush work until that QP's
 	 * do the flush work until that QP's
 	 * sdma work has finished.
 	 * sdma work has finished.
 	 */
 	 */
+	spin_lock(&qp->s_lock);
 	if (qp->s_flags & RVT_S_WAIT_DMA) {
 	if (qp->s_flags & RVT_S_WAIT_DMA) {
 		qp->s_flags &= ~RVT_S_WAIT_DMA;
 		qp->s_flags &= ~RVT_S_WAIT_DMA;
 		hfi1_schedule_send(qp);
 		hfi1_schedule_send(qp);
 	}
 	}
+	spin_unlock(&qp->s_lock);
 }
 }
 
 
 /**
 /**