RDMA/bnxt_re: Fix the usage of control path spin locks
authorSelvin Xavier <selvin.xavier@broadcom.com>
Mon, 14 Oct 2024 13:36:14 +0000 (06:36 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 21 Oct 2024 16:28:15 +0000 (13:28 -0300)
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: 1ac5a4047975 ("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>
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c

index 7294221b3316cf5fefff5c970a73af9f6b516862..ca26b88a0a80fa9006de569b16edf7ae5c642118 100644 (file)
@@ -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);
 }