IB/core: postpone WR initialization during queue drain
authorMax Gurtovoy <maxg@mellanox.com>
Sun, 14 Jan 2018 15:07:48 +0000 (17:07 +0200)
committerDoug Ledford <dledford@redhat.com>
Thu, 18 Jan 2018 19:49:20 +0000 (14:49 -0500)
No need to initialize completion and WR in case we fail
during QP modification.

Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
Acked-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/verbs.c

index 49a2a764c0bfa39be46e408a34e08dd0e3f056b9..e9c3991a93ff1409d5a3dfc78fdec328bf733698 100644 (file)
@@ -2191,16 +2191,16 @@ static void __ib_drain_sq(struct ib_qp *qp)
        struct ib_send_wr swr = {}, *bad_swr;
        int ret;
 
-       swr.wr_cqe = &sdrain.cqe;
-       sdrain.cqe.done = ib_drain_qp_done;
-       init_completion(&sdrain.done);
-
        ret = ib_modify_qp(qp, &attr, IB_QP_STATE);
        if (ret) {
                WARN_ONCE(ret, "failed to drain send queue: %d\n", ret);
                return;
        }
 
+       swr.wr_cqe = &sdrain.cqe;
+       sdrain.cqe.done = ib_drain_qp_done;
+       init_completion(&sdrain.done);
+
        ret = ib_post_send(qp, &swr, &bad_swr);
        if (ret) {
                WARN_ONCE(ret, "failed to drain send queue: %d\n", ret);
@@ -2225,16 +2225,16 @@ static void __ib_drain_rq(struct ib_qp *qp)
        struct ib_recv_wr rwr = {}, *bad_rwr;
        int ret;
 
-       rwr.wr_cqe = &rdrain.cqe;
-       rdrain.cqe.done = ib_drain_qp_done;
-       init_completion(&rdrain.done);
-
        ret = ib_modify_qp(qp, &attr, IB_QP_STATE);
        if (ret) {
                WARN_ONCE(ret, "failed to drain recv queue: %d\n", ret);
                return;
        }
 
+       rwr.wr_cqe = &rdrain.cqe;
+       rdrain.cqe.done = ib_drain_qp_done;
+       init_completion(&rdrain.done);
+
        ret = ib_post_recv(qp, &rwr, &bad_rwr);
        if (ret) {
                WARN_ONCE(ret, "failed to drain recv queue: %d\n", ret);