RDMA/bnxt_re: Fix the usage of control path spin locks
BugLink: https://bugs.launchpad.net/bugs/2099996
[ Upstream commit d71f4acd584cc861f54b3cb3ac07875f06550a05 ]
Control path completion processing always runs in tasklet context. To
synchronize with the posting thread, there is no need to use the irq
variant of spin lock. Use spin_lock_bh instead.
Fixes: 1ac5a40479 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
Link: https://patch.msgid.link/r/1728912975-19346-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Koichiro Den <koichiro.den@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
committed by
Stefan Bader
parent
dcd6b646ac
commit
54bd6e1d17
@@ -290,7 +290,6 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_hwq *hwq;
|
||||
u32 sw_prod, cmdq_prod;
|
||||
struct pci_dev *pdev;
|
||||
unsigned long flags;
|
||||
u16 cookie;
|
||||
u8 *preq;
|
||||
|
||||
@@ -301,7 +300,7 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
/* Cmdq are in 16-byte units, each request can consume 1 or more
|
||||
* cmdqe
|
||||
*/
|
||||
spin_lock_irqsave(&hwq->lock, flags);
|
||||
spin_lock_bh(&hwq->lock);
|
||||
required_slots = bnxt_qplib_get_cmd_slots(msg->req);
|
||||
free_slots = HWQ_FREE_SLOTS(hwq);
|
||||
cookie = cmdq->seq_num & RCFW_MAX_COOKIE_VALUE;
|
||||
@@ -311,7 +310,7 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
dev_info_ratelimited(&pdev->dev,
|
||||
"CMDQ is full req/free %d/%d!",
|
||||
required_slots, free_slots);
|
||||
spin_unlock_irqrestore(&hwq->lock, flags);
|
||||
spin_unlock_bh(&hwq->lock);
|
||||
return -EAGAIN;
|
||||
}
|
||||
if (msg->block)
|
||||
@@ -367,7 +366,7 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
wmb();
|
||||
writel(cmdq_prod, cmdq->cmdq_mbox.prod);
|
||||
writel(RCFW_CMDQ_TRIG_VAL, cmdq->cmdq_mbox.db);
|
||||
spin_unlock_irqrestore(&hwq->lock, flags);
|
||||
spin_unlock_bh(&hwq->lock);
|
||||
/* Return the CREQ response pointer */
|
||||
return 0;
|
||||
}
|
||||
@@ -486,7 +485,6 @@ static int __bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
{
|
||||
struct creq_qp_event *evnt = (struct creq_qp_event *)msg->resp;
|
||||
struct bnxt_qplib_crsqe *crsqe;
|
||||
unsigned long flags;
|
||||
u16 cookie;
|
||||
int rc;
|
||||
u8 opcode;
|
||||
@@ -512,12 +510,12 @@ static int __bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
rc = __poll_for_resp(rcfw, cookie);
|
||||
|
||||
if (rc) {
|
||||
spin_lock_irqsave(&rcfw->cmdq.hwq.lock, flags);
|
||||
spin_lock_bh(&rcfw->cmdq.hwq.lock);
|
||||
crsqe = &rcfw->crsqe_tbl[cookie];
|
||||
crsqe->is_waiter_alive = false;
|
||||
if (rc == -ENODEV)
|
||||
set_bit(FIRMWARE_STALL_DETECTED, &rcfw->cmdq.flags);
|
||||
spin_unlock_irqrestore(&rcfw->cmdq.hwq.lock, flags);
|
||||
spin_unlock_bh(&rcfw->cmdq.hwq.lock);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
@@ -628,7 +626,6 @@ static int bnxt_qplib_process_qp_event(struct bnxt_qplib_rcfw *rcfw,
|
||||
u16 cookie, blocked = 0;
|
||||
bool is_waiter_alive;
|
||||
struct pci_dev *pdev;
|
||||
unsigned long flags;
|
||||
u32 wait_cmds = 0;
|
||||
int rc = 0;
|
||||
|
||||
@@ -659,8 +656,7 @@ static int bnxt_qplib_process_qp_event(struct bnxt_qplib_rcfw *rcfw,
|
||||
*
|
||||
*/
|
||||
|
||||
spin_lock_irqsave_nested(&hwq->lock, flags,
|
||||
SINGLE_DEPTH_NESTING);
|
||||
spin_lock_nested(&hwq->lock, SINGLE_DEPTH_NESTING);
|
||||
cookie = le16_to_cpu(qp_event->cookie);
|
||||
blocked = cookie & RCFW_CMD_IS_BLOCKING;
|
||||
cookie &= RCFW_MAX_COOKIE_VALUE;
|
||||
@@ -672,7 +668,7 @@ static int bnxt_qplib_process_qp_event(struct bnxt_qplib_rcfw *rcfw,
|
||||
dev_info(&pdev->dev,
|
||||
"rcfw timedout: cookie = %#x, free_slots = %d",
|
||||
cookie, crsqe->free_slots);
|
||||
spin_unlock_irqrestore(&hwq->lock, flags);
|
||||
spin_unlock(&hwq->lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -720,7 +716,7 @@ static int bnxt_qplib_process_qp_event(struct bnxt_qplib_rcfw *rcfw,
|
||||
__destroy_timedout_ah(rcfw,
|
||||
(struct creq_create_ah_resp *)
|
||||
qp_event);
|
||||
spin_unlock_irqrestore(&hwq->lock, flags);
|
||||
spin_unlock(&hwq->lock);
|
||||
}
|
||||
*num_wait += wait_cmds;
|
||||
return rc;
|
||||
@@ -734,12 +730,11 @@ static void bnxt_qplib_service_creq(struct tasklet_struct *t)
|
||||
u32 type, budget = CREQ_ENTRY_POLL_BUDGET;
|
||||
struct bnxt_qplib_hwq *hwq = &creq->hwq;
|
||||
struct creq_base *creqe;
|
||||
unsigned long flags;
|
||||
u32 num_wakeup = 0;
|
||||
u32 hw_polled = 0;
|
||||
|
||||
/* Service the CREQ until budget is over */
|
||||
spin_lock_irqsave(&hwq->lock, flags);
|
||||
spin_lock_bh(&hwq->lock);
|
||||
while (budget > 0) {
|
||||
creqe = bnxt_qplib_get_qe(hwq, hwq->cons, NULL);
|
||||
if (!CREQ_CMP_VALID(creqe, creq->creq_db.dbinfo.flags))
|
||||
@@ -782,7 +777,7 @@ static void bnxt_qplib_service_creq(struct tasklet_struct *t)
|
||||
if (hw_polled)
|
||||
bnxt_qplib_ring_nq_db(&creq->creq_db.dbinfo,
|
||||
rcfw->res->cctx, true);
|
||||
spin_unlock_irqrestore(&hwq->lock, flags);
|
||||
spin_unlock_bh(&hwq->lock);
|
||||
if (num_wakeup)
|
||||
wake_up_nr(&rcfw->cmdq.waitq, num_wakeup);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user