Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RDMA/irdma: Take a lock before moving SRQ tail in poll_cq

Need to take an SRQ lock in poll_cq before moving SRQ tail.

Signed-off-by: Jay Bhat <jay.bhat@intel.com>
Reviewed-by: Jacob Moroni <jmoroni@google.com>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
Link: https://patch.msgid.link/20251031021726.1003-7-tatyana.e.nikolova@intel.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>

authored by

Jay Bhat and committed by
Leon Romanovsky
da58d422 0a192745

+7
+5
drivers/infiniband/hw/irdma/uk.c
··· 1309 1309 info->op_type = (u8)FIELD_GET(IRDMACQ_OP, qword3); 1310 1310 1311 1311 if (info->q_type == IRDMA_CQE_QTYPE_RQ && is_srq) { 1312 + unsigned long flags; 1313 + 1312 1314 srq = qp->srq_uk; 1313 1315 1314 1316 get_64bit_val(cqe, 8, &info->wr_id); ··· 1323 1321 } else { 1324 1322 info->stag_invalid_set = false; 1325 1323 } 1324 + spin_lock_irqsave(srq->lock, flags); 1326 1325 IRDMA_RING_MOVE_TAIL(srq->srq_ring); 1326 + spin_unlock_irqrestore(srq->lock, flags); 1327 1327 pring = &srq->srq_ring; 1328 + 1328 1329 } else if (info->q_type == IRDMA_CQE_QTYPE_RQ && !is_srq) { 1329 1330 u32 array_idx; 1330 1331
+1
drivers/infiniband/hw/irdma/user.h
··· 466 466 u8 wqe_size; 467 467 u8 wqe_size_multiplier; 468 468 u8 deferred_flag; 469 + spinlock_t *lock; 469 470 }; 470 471 471 472 struct irdma_srq_uk_init_info {
+1
drivers/infiniband/hw/irdma/verbs.c
··· 2388 2388 info.vsi = &iwdev->vsi; 2389 2389 info.pd = &iwpd->sc_pd; 2390 2390 2391 + iwsrq->sc_srq.srq_uk.lock = &iwsrq->lock; 2391 2392 err_code = irdma_sc_srq_init(&iwsrq->sc_srq, &info); 2392 2393 if (err_code) 2393 2394 goto free_dmem;