Skip to content

Commit

Permalink
RDMA/ucma: Return stable IB device index as identifier
Browse files Browse the repository at this point in the history
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.

Link: https://lore.kernel.org/r/20200504132541.355710-1-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
  • Loading branch information
Leon Romanovsky authored and Jason Gunthorpe committed May 12, 2020
1 parent 52c81f4 commit 1779383
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
16 changes: 9 additions & 7 deletions drivers/infiniband/core/ucma.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,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)))
Expand All @@ -869,6 +869,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))
Expand All @@ -880,8 +881,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);
Expand All @@ -895,6 +896,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));
Expand All @@ -907,7 +909,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);
Expand All @@ -922,7 +924,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;
Expand Down Expand Up @@ -974,7 +976,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);
Expand Down Expand Up @@ -1007,7 +1009,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;
Expand Down
4 changes: 4 additions & 0 deletions include/uapi/rdma/rdma_user_cm.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,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 {
Expand All @@ -175,6 +177,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 {
Expand Down

0 comments on commit 1779383

Please sign in to comment.