RDMA/bnxt_re: Make use of destroy AH sleepable flag
authorGal Pressman <galpress@amazon.com>
Wed, 12 Dec 2018 09:09:08 +0000 (11:09 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 19 Dec 2018 23:28:04 +0000 (16:28 -0700)
When in a sleepable (non-atomic) context, wait for firmware completion
instead of polling for it.

Signed-off-by: Gal Pressman <galpress@amazon.com>
Acked-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/qplib_sp.c
drivers/infiniband/hw/bnxt_re/qplib_sp.h

index 7f934c2..1e2515e 100644 (file)
@@ -653,7 +653,8 @@ int bnxt_re_destroy_ah(struct ib_ah *ib_ah, u32 flags)
        struct bnxt_re_dev *rdev = ah->rdev;
        int rc;
 
-       rc = bnxt_qplib_destroy_ah(&rdev->qplib_res, &ah->qplib_ah);
+       rc = bnxt_qplib_destroy_ah(&rdev->qplib_res, &ah->qplib_ah,
+                                  !(flags & RDMA_DESTROY_AH_SLEEPABLE));
        if (rc) {
                dev_err(rdev_to_dev(rdev), "Failed to destroy HW AH");
                return rc;
@@ -820,7 +821,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp)
 
        if (ib_qp->qp_type == IB_QPT_GSI && rdev->qp1_sqp) {
                rc = bnxt_qplib_destroy_ah(&rdev->qplib_res,
-                                          &rdev->sqp_ah->qplib_ah);
+                                          &rdev->sqp_ah->qplib_ah, false);
                if (rc) {
                        dev_err(rdev_to_dev(rdev),
                                "Failed to destroy HW AH for shadow QP");
index 8f4b19e..be03b57 100644 (file)
@@ -531,7 +531,8 @@ int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah,
        return 0;
 }
 
-int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah)
+int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah,
+                         bool block)
 {
        struct bnxt_qplib_rcfw *rcfw = res->rcfw;
        struct cmdq_destroy_ah req;
@@ -545,7 +546,7 @@ int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah)
        req.ah_cid = cpu_to_le32(ah->id);
 
        rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp,
-                                         NULL, 1);
+                                         NULL, block);
        if (rc)
                return rc;
        return 0;
index 53145aa..39454b3 100644 (file)
@@ -243,7 +243,8 @@ int bnxt_qplib_set_func_resources(struct bnxt_qplib_res *res,
                                  struct bnxt_qplib_ctx *ctx);
 int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah,
                         bool block);
-int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah);
+int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah,
+                         bool block);
 int bnxt_qplib_alloc_mrw(struct bnxt_qplib_res *res,
                         struct bnxt_qplib_mrw *mrw);
 int bnxt_qplib_dereg_mrw(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mrw,