RDMA/cma: Connect ECE to rdma_accept
authorLeon Romanovsky <leonro@mellanox.com>
Tue, 26 May 2020 10:33:03 +0000 (13:33 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 27 May 2020 19:05:05 +0000 (16:05 -0300)
The rdma_accept() is called by both passive and active sides of CMID
connection to mark readiness to start data transfer. For passive side,
this is called explicitly, for active side, it is called implicitly while
receiving REP message.

Provide ECE data to rdma_accept function needed for passive side to send
that REP message.

Link: https://lore.kernel.org/r/20200526103304.196371-6-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/cma.c
drivers/infiniband/core/ucma.c
include/rdma/rdma_cm.h
include/uapi/rdma/rdma_user_cm.h

index f554a371f4fab5478fd664e0cadd4cc8ee28da95..d449afe5557b21ac9aae00d46aa13df9ce225908 100644 (file)
@@ -4090,6 +4090,8 @@ static int cma_accept_ib(struct rdma_id_private *id_priv,
        rep.flow_control = conn_param->flow_control;
        rep.rnr_retry_count = min_t(u8, 7, conn_param->rnr_retry_count);
        rep.srq = id_priv->srq ? 1 : 0;
+       rep.ece.vendor_id = id_priv->ece.vendor_id;
+       rep.ece.attr_mod = id_priv->ece.attr_mod;
 
        trace_cm_send_rep(id_priv);
        ret = ib_send_cm_rep(id_priv->cm_id.ib, &rep);
@@ -4137,7 +4139,11 @@ static int cma_send_sidr_rep(struct rdma_id_private *id_priv,
                        return ret;
                rep.qp_num = id_priv->qp_num;
                rep.qkey = id_priv->qkey;
+
+               rep.ece.vendor_id = id_priv->ece.vendor_id;
+               rep.ece.attr_mod = id_priv->ece.attr_mod;
        }
+
        rep.private_data = private_data;
        rep.private_data_len = private_data_len;
 
@@ -4195,6 +4201,19 @@ reject:
 }
 EXPORT_SYMBOL(__rdma_accept);
 
+int __rdma_accept_ece(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
+                     const char *caller, struct rdma_ucm_ece *ece)
+{
+       struct rdma_id_private *id_priv =
+               container_of(id, struct rdma_id_private, id);
+
+       id_priv->ece.vendor_id = ece->vendor_id;
+       id_priv->ece.attr_mod = ece->attr_mod;
+
+       return __rdma_accept(id, conn_param, caller);
+}
+EXPORT_SYMBOL(__rdma_accept_ece);
+
 int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
 {
        struct rdma_id_private *id_priv;
index 3e5268cfa164ffa5b8444a764620af0fcd0097eb..6b27b210b890fe17cdf80c89fb337bbe83ea28f3 100644 (file)
@@ -1135,28 +1135,36 @@ static ssize_t ucma_accept(struct ucma_file *file, const char __user *inbuf,
 {
        struct rdma_ucm_accept cmd;
        struct rdma_conn_param conn_param;
+       struct rdma_ucm_ece ece = {};
        struct ucma_context *ctx;
+       size_t in_size;
        int ret;
 
-       if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
+       in_size = min_t(size_t, in_len, sizeof(cmd));
+       if (copy_from_user(&cmd, inbuf, in_size))
                return -EFAULT;
 
        ctx = ucma_get_ctx_dev(file, cmd.id);
        if (IS_ERR(ctx))
                return PTR_ERR(ctx);
 
+       if (offsetofend(typeof(cmd), ece) <= in_size) {
+               ece.vendor_id = cmd.ece.vendor_id;
+               ece.attr_mod = cmd.ece.attr_mod;
+       }
+
        if (cmd.conn_param.valid) {
                ucma_copy_conn_param(ctx->cm_id, &conn_param, &cmd.conn_param);
                mutex_lock(&file->mut);
                mutex_lock(&ctx->mutex);
-               ret = __rdma_accept(ctx->cm_id, &conn_param, NULL);
+               ret = __rdma_accept_ece(ctx->cm_id, &conn_param, NULL, &ece);
                mutex_unlock(&ctx->mutex);
                if (!ret)
                        ctx->uid = cmd.uid;
                mutex_unlock(&file->mut);
        } else {
                mutex_lock(&ctx->mutex);
-               ret = __rdma_accept(ctx->cm_id, NULL, NULL);
+               ret = __rdma_accept_ece(ctx->cm_id, NULL, NULL, &ece);
                mutex_unlock(&ctx->mutex);
        }
        ucma_put_ctx(ctx);
index 418590c9a9e861700856446ae013518d5f264414..7ac91677660fa2bda67ed9d70f508e1c6eedeb25 100644 (file)
@@ -280,6 +280,9 @@ int rdma_listen(struct rdma_cm_id *id, int backlog);
 int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
                  const char *caller);
 
+int __rdma_accept_ece(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
+                     const char *caller, struct rdma_ucm_ece *ece);
+
 /**
  * rdma_accept - Called to accept a connection request or response.
  * @id: Connection identifier associated with the request.
index 19c5c3f74af948de16fa42b30cf54b2e9592d127..6b883dde7064eaef4cb3c9aaffa1c98e5084c9d9 100644 (file)
@@ -232,6 +232,7 @@ struct rdma_ucm_accept {
        struct rdma_ucm_conn_param conn_param;
        __u32 id;
        __u32 reserved;
+       struct rdma_ucm_ece ece;
 };
 
 struct rdma_ucm_reject {