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

RDMA/mlx5: Introduce GET_DATA_DIRECT_SYSFS_PATH ioctl

Introduce the 'GET_DATA_DIRECT_SYSFS_PATH' ioctl to return the sysfs
path of the affiliated 'data direct' device for a given device.

Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://patch.msgid.link/403745463e0ef52adbef681ff09aa6a29a756352.1722512548.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>

authored by

Yishai Hadas and committed by
Leon Romanovsky
ec7ad653 de8f847a

+59 -1
+54 -1
drivers/infiniband/hw/mlx5/std_types.c
··· 10 10 #include <linux/mlx5/eswitch.h> 11 11 #include <linux/mlx5/vport.h> 12 12 #include "mlx5_ib.h" 13 + #include "data_direct.h" 13 14 14 15 #define UVERBS_MODULE_NAME mlx5_ib 15 16 #include <rdma/uverbs_named_ioctl.h> ··· 205 204 sizeof(info)); 206 205 } 207 206 207 + static int UVERBS_HANDLER(MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH)( 208 + struct uverbs_attr_bundle *attrs) 209 + { 210 + struct mlx5_data_direct_dev *data_direct_dev; 211 + struct mlx5_ib_ucontext *c; 212 + struct mlx5_ib_dev *dev; 213 + int out_len = uverbs_attr_get_len(attrs, 214 + MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH); 215 + u32 dev_path_len; 216 + char *dev_path; 217 + int ret; 218 + 219 + c = to_mucontext(ib_uverbs_get_ucontext(attrs)); 220 + if (IS_ERR(c)) 221 + return PTR_ERR(c); 222 + dev = to_mdev(c->ibucontext.device); 223 + mutex_lock(&dev->data_direct_lock); 224 + data_direct_dev = dev->data_direct_dev; 225 + if (!data_direct_dev) { 226 + ret = -ENODEV; 227 + goto end; 228 + } 229 + 230 + dev_path = kobject_get_path(&data_direct_dev->device->kobj, GFP_KERNEL); 231 + if (!dev_path) { 232 + ret = -ENOMEM; 233 + goto end; 234 + } 235 + 236 + dev_path_len = strlen(dev_path) + 1; 237 + if (dev_path_len > out_len) { 238 + ret = -ENOSPC; 239 + goto end; 240 + } 241 + 242 + ret = uverbs_copy_to(attrs, MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH, dev_path, 243 + dev_path_len); 244 + kfree(dev_path); 245 + 246 + end: 247 + mutex_unlock(&dev->data_direct_lock); 248 + return ret; 249 + } 250 + 208 251 DECLARE_UVERBS_NAMED_METHOD( 209 252 MLX5_IB_METHOD_QUERY_PORT, 210 253 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_QUERY_PORT_PORT_NUM, ··· 259 214 reg_c0), 260 215 UA_MANDATORY)); 261 216 217 + DECLARE_UVERBS_NAMED_METHOD( 218 + MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH, 219 + UVERBS_ATTR_PTR_OUT( 220 + MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH, 221 + UVERBS_ATTR_MIN_SIZE(0), 222 + UA_MANDATORY)); 223 + 262 224 ADD_UVERBS_METHODS(mlx5_ib_device, 263 225 UVERBS_OBJECT_DEVICE, 264 - &UVERBS_METHOD(MLX5_IB_METHOD_QUERY_PORT)); 226 + &UVERBS_METHOD(MLX5_IB_METHOD_QUERY_PORT), 227 + &UVERBS_METHOD(MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH)); 265 228 266 229 DECLARE_UVERBS_NAMED_METHOD( 267 230 MLX5_IB_METHOD_PD_QUERY,
+5
include/uapi/rdma/mlx5_user_ioctl_cmds.h
··· 348 348 349 349 enum mlx5_ib_device_methods { 350 350 MLX5_IB_METHOD_QUERY_PORT = (1U << UVERBS_ID_NS_SHIFT), 351 + MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH, 351 352 }; 352 353 353 354 enum mlx5_ib_query_port_attrs { 354 355 MLX5_IB_ATTR_QUERY_PORT_PORT_NUM = (1U << UVERBS_ID_NS_SHIFT), 355 356 MLX5_IB_ATTR_QUERY_PORT, 357 + }; 358 + 359 + enum mlx5_ib_get_data_direct_sysfs_path_attrs { 360 + MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH = (1U << UVERBS_ID_NS_SHIFT), 356 361 }; 357 362 358 363 #endif