All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leon Romanovsky <leon@kernel.org>
To: Doug Ledford <dledford@redhat.com>, Jason Gunthorpe <jgg@mellanox.com>
Cc: Leon Romanovsky <leonro@mellanox.com>,
	linux-rdma@vger.kernel.org, Gal Pressman <galpress@amazon.com>
Subject: [PATCH rdma-next v1] RDMA/ucma: Return stable IB device index as identifier
Date: Mon,  4 May 2020 16:25:41 +0300	[thread overview]
Message-ID: <20200504132541.355710-1-leon@kernel.org> (raw)

From: Leon Romanovsky <leonro@mellanox.com>

The librdmacm uses node_guid as identifier to correlate between
IB devices and CMA devices. However FW resets cause to such
"connection" to be lost and require from the user to restart
its application.

Extend UCMA to return IB device index, which is stable identifier.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
Changelog:
v1: Fixed padding to u64 in response structures
v0: https://lore.kernel.org/linux-rdma/20200430152939.77967-1-leon@kernel.org
---
 drivers/infiniband/core/ucma.c   | 16 +++++++++-------
 include/uapi/rdma/rdma_user_cm.h |  4 ++++
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
index 99482dc5934b..d5723465478e 100644
--- a/drivers/infiniband/core/ucma.c
+++ b/drivers/infiniband/core/ucma.c
@@ -848,7 +848,7 @@ static ssize_t ucma_query_route(struct ucma_file *file,
 	struct sockaddr *addr;
 	int ret = 0;

-	if (out_len < sizeof(resp))
+	if (out_len < offsetof(struct rdma_ucm_query_route_resp, ibdev_index))
 		return -ENOSPC;

 	if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
@@ -872,6 +872,7 @@ static ssize_t ucma_query_route(struct ucma_file *file,
 		goto out;

 	resp.node_guid = (__force __u64) ctx->cm_id->device->node_guid;
+	resp.ibdev_index = ctx->cm_id->device->index;
 	resp.port_num = ctx->cm_id->port_num;

 	if (rdma_cap_ib_sa(ctx->cm_id->device, ctx->cm_id->port_num))
@@ -883,8 +884,8 @@ static ssize_t ucma_query_route(struct ucma_file *file,

 out:
 	mutex_unlock(&ctx->mutex);
-	if (copy_to_user(u64_to_user_ptr(cmd.response),
-			 &resp, sizeof(resp)))
+	if (copy_to_user(u64_to_user_ptr(cmd.response), &resp,
+			 min_t(size_t, out_len, sizeof(resp))))
 		ret = -EFAULT;

 	ucma_put_ctx(ctx);
@@ -898,6 +899,7 @@ static void ucma_query_device_addr(struct rdma_cm_id *cm_id,
 		return;

 	resp->node_guid = (__force __u64) cm_id->device->node_guid;
+	resp->ibdev_index = cm_id->device->index;
 	resp->port_num = cm_id->port_num;
 	resp->pkey = (__force __u16) cpu_to_be16(
 		     ib_addr_get_pkey(&cm_id->route.addr.dev_addr));
@@ -910,7 +912,7 @@ static ssize_t ucma_query_addr(struct ucma_context *ctx,
 	struct sockaddr *addr;
 	int ret = 0;

-	if (out_len < sizeof(resp))
+	if (out_len < offsetof(struct rdma_ucm_query_addr_resp, ibdev_index))
 		return -ENOSPC;

 	memset(&resp, 0, sizeof resp);
@@ -925,7 +927,7 @@ static ssize_t ucma_query_addr(struct ucma_context *ctx,

 	ucma_query_device_addr(ctx->cm_id, &resp);

-	if (copy_to_user(response, &resp, sizeof(resp)))
+	if (copy_to_user(response, &resp, min_t(size_t, out_len, sizeof(resp))))
 		ret = -EFAULT;

 	return ret;
@@ -977,7 +979,7 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
 	struct sockaddr_ib *addr;
 	int ret = 0;

-	if (out_len < sizeof(resp))
+	if (out_len < offsetof(struct rdma_ucm_query_addr_resp, ibdev_index))
 		return -ENOSPC;

 	memset(&resp, 0, sizeof resp);
@@ -1010,7 +1012,7 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
 						    &ctx->cm_id->route.addr.dst_addr);
 	}

-	if (copy_to_user(response, &resp, sizeof(resp)))
+	if (copy_to_user(response, &resp, min_t(size_t, out_len, sizeof(resp))))
 		ret = -EFAULT;

 	return ret;
diff --git a/include/uapi/rdma/rdma_user_cm.h b/include/uapi/rdma/rdma_user_cm.h
index e545f2de1e13..91a52e3fccaf 100644
--- a/include/uapi/rdma/rdma_user_cm.h
+++ b/include/uapi/rdma/rdma_user_cm.h
@@ -168,6 +168,8 @@ struct rdma_ucm_query_route_resp {
 	__u32 num_paths;
 	__u8 port_num;
 	__u8 reserved[3];
+	__u32 ibdev_index;
+	__u32 reserved1;
 };

 struct rdma_ucm_query_addr_resp {
@@ -179,6 +181,8 @@ struct rdma_ucm_query_addr_resp {
 	__u16 dst_size;
 	struct __kernel_sockaddr_storage src_addr;
 	struct __kernel_sockaddr_storage dst_addr;
+	__u32 ibdev_index;
+	__u32 reserved1;
 };

 struct rdma_ucm_query_path_resp {
--
2.26.2


             reply	other threads:[~2020-05-04 13:25 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-04 13:25 Leon Romanovsky [this message]
2020-05-12 23:10 ` [PATCH rdma-next v1] RDMA/ucma: Return stable IB device index as identifier Jason Gunthorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200504132541.355710-1-leon@kernel.org \
    --to=leon@kernel.org \
    --cc=dledford@redhat.com \
    --cc=galpress@amazon.com \
    --cc=jgg@mellanox.com \
    --cc=leonro@mellanox.com \
    --cc=linux-rdma@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.