Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Mark Zhang and committed by
Leon Romanovsky
810f874e a6404823

+61 -1
+40
drivers/infiniband/core/ucma.c
··· 1021 1021 return ret; 1022 1022 } 1023 1023 1024 + static ssize_t ucma_query_ib_service(struct ucma_context *ctx, 1025 + void __user *response, int out_len) 1026 + { 1027 + struct rdma_ucm_query_ib_service_resp *resp; 1028 + int n, ret = 0; 1029 + 1030 + if (out_len < sizeof(struct rdma_ucm_query_ib_service_resp)) 1031 + return -ENOSPC; 1032 + 1033 + if (!ctx->cm_id->route.service_recs) 1034 + return -ENODATA; 1035 + 1036 + resp = kzalloc(out_len, GFP_KERNEL); 1037 + if (!resp) 1038 + return -ENOMEM; 1039 + 1040 + resp->num_service_recs = ctx->cm_id->route.num_service_recs; 1041 + 1042 + n = (out_len - sizeof(struct rdma_ucm_query_ib_service_resp)) / 1043 + sizeof(struct ib_user_service_rec); 1044 + 1045 + if (!n) 1046 + goto out; 1047 + 1048 + if (n > ctx->cm_id->route.num_service_recs) 1049 + n = ctx->cm_id->route.num_service_recs; 1050 + 1051 + memcpy(resp->recs, ctx->cm_id->route.service_recs, 1052 + sizeof(*resp->recs) * n); 1053 + if (copy_to_user(response, resp, struct_size(resp, recs, n))) 1054 + ret = -EFAULT; 1055 + 1056 + out: 1057 + kfree(resp); 1058 + return ret; 1059 + } 1060 + 1024 1061 static ssize_t ucma_query(struct ucma_file *file, 1025 1062 const char __user *inbuf, 1026 1063 int in_len, int out_len) ··· 1085 1048 break; 1086 1049 case RDMA_USER_CM_QUERY_GID: 1087 1050 ret = ucma_query_gid(ctx, response, out_len); 1051 + break; 1052 + case RDMA_USER_CM_QUERY_IB_SERVICE: 1053 + ret = ucma_query_ib_service(ctx, response, out_len); 1088 1054 break; 1089 1055 default: 1090 1056 ret = -ENOSYS;
+14
include/uapi/rdma/ib_user_sa.h
··· 74 74 __u8 preference; 75 75 }; 76 76 77 + struct ib_user_service_rec { 78 + __be64 id; 79 + __u8 gid[16]; 80 + __be16 pkey; 81 + __u8 reserved[2]; 82 + __be32 lease; 83 + __u8 key[16]; 84 + __u8 name[64]; 85 + __u8 data_8[16]; 86 + __be16 data_16[8]; 87 + __be32 data_32[4]; 88 + __be64 data_64[2]; 89 + }; 90 + 77 91 #endif /* IB_USER_SA_H */
+7 -1
include/uapi/rdma/rdma_user_cm.h
··· 148 148 enum { 149 149 RDMA_USER_CM_QUERY_ADDR, 150 150 RDMA_USER_CM_QUERY_PATH, 151 - RDMA_USER_CM_QUERY_GID 151 + RDMA_USER_CM_QUERY_GID, 152 + RDMA_USER_CM_QUERY_IB_SERVICE 152 153 }; 153 154 154 155 struct rdma_ucm_query { ··· 187 186 __u32 num_paths; 188 187 __u32 reserved; 189 188 struct ib_path_rec_data path_data[]; 189 + }; 190 + 191 + struct rdma_ucm_query_ib_service_resp { 192 + __u32 num_service_recs; 193 + struct ib_user_service_rec recs[]; 190 194 }; 191 195 192 196 struct rdma_ucm_conn_param {