]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/irdma: Remove fixed 1 ms delay during AH wait loop
authorJacob Moroni <jmoroni@google.com>
Mon, 5 Jan 2026 18:05:50 +0000 (18:05 +0000)
committerLeon Romanovsky <leon@kernel.org>
Tue, 13 Jan 2026 13:19:11 +0000 (08:19 -0500)
The AH CQP command wait loop executes in an atomic context and was
using a fixed 1 ms delay. Since many AH create commands can complete
much faster than 1 ms, use poll_timeout_us_atomic with a 1 us delay.

Also, use the timeout value indicated during the capability exchange
rather than a hard-coded value.

Signed-off-by: Jacob Moroni <jmoroni@google.com>
Link: https://patch.msgid.link/20260105180550.2907858-1-jmoroni@google.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/irdma/main.h
drivers/infiniband/hw/irdma/utils.c
drivers/infiniband/hw/irdma/verbs.c

index baab61e424a267cc52b5e5e0eee25a3568050ea1..d320d1a228b33473b72ed6f287a564ad93901663 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/workqueue.h>
 #include <linux/slab.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/crc32c.h>
 #include <linux/kthread.h>
 #ifndef CONFIG_64BIT
@@ -528,6 +529,7 @@ void irdma_cq_wq_destroy(struct irdma_pci_f *rf, struct irdma_sc_cq *cq);
 void irdma_srq_event(struct irdma_sc_srq *srq);
 void irdma_srq_wq_destroy(struct irdma_pci_f *rf, struct irdma_sc_srq *srq);
 void irdma_cleanup_pending_cqp_op(struct irdma_pci_f *rf);
+int irdma_get_timeout_threshold(struct irdma_sc_dev *dev);
 int irdma_hw_modify_qp(struct irdma_device *iwdev, struct irdma_qp *iwqp,
                       struct irdma_modify_qp_info *info, bool wait);
 int irdma_qp_suspend_resume(struct irdma_sc_qp *qp, bool suspend);
index cc2a12f735d37169590a58c03fb829c9a9abf8dc..3bac7c2588aeace87d80cb8a440bbf787be6372b 100644 (file)
@@ -572,7 +572,7 @@ void irdma_cleanup_pending_cqp_op(struct irdma_pci_f *rf)
        }
 }
 
-static int irdma_get_timeout_threshold(struct irdma_sc_dev *dev)
+int irdma_get_timeout_threshold(struct irdma_sc_dev *dev)
 {
        u16 time_s = dev->vc_caps.cqp_timeout_s;
 
index 6d9af41a2884a48c96db1c9dc3f5f67ee8e46468..1f1efd4971a9d1baa75cb6fe69f93135452c6c9b 100644 (file)
@@ -5027,15 +5027,15 @@ static int irdma_create_hw_ah(struct irdma_device *iwdev, struct irdma_ah *ah, b
        }
 
        if (!sleep) {
-               int cnt = CQP_COMPL_WAIT_TIME_MS * CQP_TIMEOUT_THRESHOLD;
+               const u64 tmout_ms = irdma_get_timeout_threshold(&rf->sc_dev) *
+                       CQP_COMPL_WAIT_TIME_MS;
 
-               do {
-                       irdma_cqp_ce_handler(rf, &rf->ccq.sc_cq);
-                       mdelay(1);
-               } while (!ah->sc_ah.ah_info.ah_valid && --cnt);
-
-               if (!cnt) {
-                       ibdev_dbg(&iwdev->ibdev, "VERBS: CQP create AH timed out");
+               if (poll_timeout_us_atomic(irdma_cqp_ce_handler(rf,
+                                                               &rf->ccq.sc_cq),
+                                          ah->sc_ah.ah_info.ah_valid, 1,
+                                          tmout_ms * USEC_PER_MSEC, false)) {
+                       ibdev_dbg(&iwdev->ibdev,
+                                 "VERBS: CQP create AH timed out");
                        err = -ETIMEDOUT;
                        goto err_ah_create;
                }