mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 01:53:29 +02:00
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:
parent
a6404823fe
commit
810f874eda
|
|
@ -1021,6 +1021,43 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
|
||||||
return ret;
|
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,
|
static ssize_t ucma_query(struct ucma_file *file,
|
||||||
const char __user *inbuf,
|
const char __user *inbuf,
|
||||||
int in_len, int out_len)
|
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:
|
case RDMA_USER_CM_QUERY_GID:
|
||||||
ret = ucma_query_gid(ctx, response, out_len);
|
ret = ucma_query_gid(ctx, response, out_len);
|
||||||
break;
|
break;
|
||||||
|
case RDMA_USER_CM_QUERY_IB_SERVICE:
|
||||||
|
ret = ucma_query_ib_service(ctx, response, out_len);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -74,4 +74,18 @@ struct ib_user_path_rec {
|
||||||
__u8 preference;
|
__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 */
|
#endif /* IB_USER_SA_H */
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,8 @@ struct rdma_ucm_resolve_route {
|
||||||
enum {
|
enum {
|
||||||
RDMA_USER_CM_QUERY_ADDR,
|
RDMA_USER_CM_QUERY_ADDR,
|
||||||
RDMA_USER_CM_QUERY_PATH,
|
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 {
|
struct rdma_ucm_query {
|
||||||
|
|
@ -188,6 +189,11 @@ struct rdma_ucm_query_path_resp {
|
||||||
struct ib_path_rec_data path_data[];
|
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 {
|
struct rdma_ucm_conn_param {
|
||||||
__u32 qp_num;
|
__u32 qp_num;
|
||||||
__u32 qkey;
|
__u32 qkey;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user