RDMA/ucma: Deliver ECE parameters through UCMA events
authorLeon Romanovsky <leonro@mellanox.com>
Tue, 26 May 2020 10:33:01 +0000 (13:33 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 27 May 2020 19:05:05 +0000 (16:05 -0300)
Passive side of CMID connection receives ECE request through REQ message
and needs to respond with relevant REP message which will be forwarded to
active side.

The UCMA events interface is responsible for such communication with the
user space (librdmacm). Extend it to provide ECE wire data.

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

index 7cbb63690241c6218d6f45db1fa054d1edadb6ff..3e5268cfa164ffa5b8444a764620af0fcd0097eb 100644 (file)
@@ -360,6 +360,9 @@ static int ucma_event_handler(struct rdma_cm_id *cm_id,
                ucma_copy_conn_event(&uevent->resp.param.conn,
                                     &event->param.conn);
 
+       uevent->resp.ece.vendor_id = event->ece.vendor_id;
+       uevent->resp.ece.attr_mod = event->ece.attr_mod;
+
        if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) {
                if (!ctx->backlog) {
                        ret = -ENOMEM;
@@ -404,7 +407,8 @@ static ssize_t ucma_get_event(struct ucma_file *file, const char __user *inbuf,
         * Old 32 bit user space does not send the 4 byte padding in the
         * reserved field. We don't care, allow it to keep working.
         */
-       if (out_len < sizeof(uevent->resp) - sizeof(uevent->resp.reserved))
+       if (out_len < sizeof(uevent->resp) - sizeof(uevent->resp.reserved) -
+                             sizeof(uevent->resp.ece))
                return -ENOSPC;
 
        if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
index 4e2975eb3643b9b2cf5a82e92c9bbe0066734ca1..418590c9a9e861700856446ae013518d5f264414 100644 (file)
@@ -111,6 +111,7 @@ struct rdma_cm_event {
                struct rdma_conn_param  conn;
                struct rdma_ud_param    ud;
        } param;
+       struct rdma_ucm_ece ece;
 };
 
 struct rdma_cm_id;
index c1409dd7225fce0171dc4215bbe0b3d086f5e215..19c5c3f74af948de16fa42b30cf54b2e9592d127 100644 (file)
@@ -297,6 +297,7 @@ struct rdma_ucm_event_resp {
                struct rdma_ucm_ud_param   ud;
        } param;
        __u32 reserved;
+       struct rdma_ucm_ece ece;
 };
 
 /* Option levels */