RDMA/ucma: Support query resolved service records

Enable user-space to query resolved service records through a ucma
command when a RDMA_CM_EVENT_ADDRINFO_RESOLVED event is received.

Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
Signed-off-by: Mark Zhang <markzhang@nvidia.com>
Reviewed-by: Vlad Dumitrescu <vdumitrescu@nvidia.com>
Link: https://patch.msgid.link/1090ee7c00c3f8058c4f9e7557de983504a16715.1751279794.git.leonro@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Mark Zhang
2025-06-30 13:52:34 +03:00
committed by Leon Romanovsky
parent a6404823fe
commit 810f874eda
3 changed files with 61 additions and 1 deletions

View File

@@ -1021,6 +1021,43 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
return ret;
}
static ssize_t ucma_query_ib_service(struct ucma_context *ctx,
void __user *response, int out_len)
{
struct rdma_ucm_query_ib_service_resp *resp;
int n, ret = 0;
if (out_len < sizeof(struct rdma_ucm_query_ib_service_resp))
return -ENOSPC;
if (!ctx->cm_id->route.service_recs)
return -ENODATA;
resp = kzalloc(out_len, GFP_KERNEL);
if (!resp)
return -ENOMEM;
resp->num_service_recs = ctx->cm_id->route.num_service_recs;
n = (out_len - sizeof(struct rdma_ucm_query_ib_service_resp)) /
sizeof(struct ib_user_service_rec);
if (!n)
goto out;
if (n > ctx->cm_id->route.num_service_recs)
n = ctx->cm_id->route.num_service_recs;
memcpy(resp->recs, ctx->cm_id->route.service_recs,
sizeof(*resp->recs) * n);
if (copy_to_user(response, resp, struct_size(resp, recs, n)))
ret = -EFAULT;
out:
kfree(resp);
return ret;
}
static ssize_t ucma_query(struct ucma_file *file,
const char __user *inbuf,
int in_len, int out_len)
@@ -1049,6 +1086,9 @@ static ssize_t ucma_query(struct ucma_file *file,
case RDMA_USER_CM_QUERY_GID:
ret = ucma_query_gid(ctx, response, out_len);
break;
case RDMA_USER_CM_QUERY_IB_SERVICE:
ret = ucma_query_ib_service(ctx, response, out_len);
break;
default:
ret = -ENOSYS;
break;

View File

@@ -74,4 +74,18 @@ struct ib_user_path_rec {
__u8 preference;
};
struct ib_user_service_rec {
__be64 id;
__u8 gid[16];
__be16 pkey;
__u8 reserved[2];
__be32 lease;
__u8 key[16];
__u8 name[64];
__u8 data_8[16];
__be16 data_16[8];
__be32 data_32[4];
__be64 data_64[2];
};
#endif /* IB_USER_SA_H */

View File

@@ -148,7 +148,8 @@ struct rdma_ucm_resolve_route {
enum {
RDMA_USER_CM_QUERY_ADDR,
RDMA_USER_CM_QUERY_PATH,
RDMA_USER_CM_QUERY_GID
RDMA_USER_CM_QUERY_GID,
RDMA_USER_CM_QUERY_IB_SERVICE
};
struct rdma_ucm_query {
@@ -188,6 +189,11 @@ struct rdma_ucm_query_path_resp {
struct ib_path_rec_data path_data[];
};
struct rdma_ucm_query_ib_service_resp {
__u32 num_service_recs;
struct ib_user_service_rec recs[];
};
struct rdma_ucm_conn_param {
__u32 qp_num;
__u32 qkey;