IB/cma: Send MRA for reply messages
authorMoni Shoua <monis@mellanox.com>
Sun, 16 Apr 2017 04:31:34 +0000 (07:31 +0300)
committerDoug Ledford <dledford@redhat.com>
Fri, 21 Apr 2017 16:29:31 +0000 (12:29 -0400)
Current implementation of RDMA_CM sends MRA (Message Receipt
Acknowledgment) only for request messages but not for response messages.

As a result, a slow active side of the connection may send a ready-to-use
message to the passive side in a delay that is too long for the passive
side to wait for.

This patch adds a call to ib_send_cm_mra() upon receiving a response
message and by this tells the other side to modify the service timeout
to a bigger value, 16 times than before. As in the request case, MRA
for reply will be sent only if a duplicate response has arrived.

Signed-off-by: Moni Shoua <monis@mellanox.com>
Reviewed-by: Matan Barak <matan@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/cma.c

index acd10d666f1ca61b95b85d065efbabc415bc66b2..c1a90f0194f452a6f4e80fb1c660120217e9b957 100644 (file)
@@ -1755,6 +1755,9 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
                event.status = -ETIMEDOUT;
                break;
        case IB_CM_REP_RECEIVED:
+               if (cma_comp(id_priv, RDMA_CM_CONNECT) &&
+                   (id_priv->id.qp_type != IB_QPT_UD))
+                       ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
                if (id_priv->id.qp) {
                        event.status = cma_rep_recv(id_priv);
                        event.event = event.status ? RDMA_CM_EVENT_CONNECT_ERROR :