Skip to content

Commit 7d96c9b

Browse files
committed
IB/uverbs: Have the core code create the uverbs_root_spec
There is no reason for drivers to do this, the core code should take of everything. The drivers will provide their information from rodata to describe their modifications to the core's base uapi specification. The core uses this to build up the runtime uapi for each device. Signed-off-by: Jason Gunthorpe <[email protected]> Reviewed-by: Michael J. Ruhl <[email protected]> Reviewed-by: Leon Romanovsky <[email protected]>
1 parent 922983c commit 7d96c9b

File tree

6 files changed

+51
-50
lines changed

6 files changed

+51
-50
lines changed

drivers/infiniband/core/uverbs_ioctl_merge.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,6 @@ void uverbs_free_spec_tree(struct uverbs_root_spec *root)
556556

557557
kfree(root);
558558
}
559-
EXPORT_SYMBOL(uverbs_free_spec_tree);
560559

561560
struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
562561
const struct uverbs_object_tree_def **trees)
@@ -661,4 +660,3 @@ struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
661660
uverbs_free_spec_tree(root_spec);
662661
return ERR_PTR(res);
663662
}
664-
EXPORT_SYMBOL(uverbs_alloc_spec_tree);

drivers/infiniband/core/uverbs_main.c

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,36 @@ static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
994994
static CLASS_ATTR_STRING(abi_version, S_IRUGO,
995995
__stringify(IB_USER_VERBS_ABI_VERSION));
996996

997+
static int ib_uverbs_create_uapi(struct ib_device *device,
998+
struct ib_uverbs_device *uverbs_dev)
999+
{
1000+
const struct uverbs_object_tree_def **specs;
1001+
struct uverbs_root_spec *specs_root;
1002+
unsigned int num_specs = 1;
1003+
unsigned int i;
1004+
1005+
if (device->driver_specs)
1006+
for (i = 0; device->driver_specs[i]; i++)
1007+
num_specs++;
1008+
1009+
specs = kmalloc_array(num_specs, sizeof(*specs), GFP_KERNEL);
1010+
if (!specs)
1011+
return -ENOMEM;
1012+
1013+
specs[0] = uverbs_default_get_objects();
1014+
if (device->driver_specs)
1015+
for (i = 0; device->driver_specs[i]; i++)
1016+
specs[i+1] = device->driver_specs[i];
1017+
1018+
specs_root = uverbs_alloc_spec_tree(num_specs, specs);
1019+
kfree(specs);
1020+
if (IS_ERR(specs_root))
1021+
return PTR_ERR(specs_root);
1022+
1023+
uverbs_dev->specs_root = specs_root;
1024+
return 0;
1025+
}
1026+
9971027
static void ib_uverbs_add_one(struct ib_device *device)
9981028
{
9991029
int devnum;
@@ -1036,6 +1066,9 @@ static void ib_uverbs_add_one(struct ib_device *device)
10361066
rcu_assign_pointer(uverbs_dev->ib_dev, device);
10371067
uverbs_dev->num_comp_vectors = device->num_comp_vectors;
10381068

1069+
if (ib_uverbs_create_uapi(device, uverbs_dev))
1070+
goto err;
1071+
10391072
cdev_init(&uverbs_dev->cdev, NULL);
10401073
uverbs_dev->cdev.owner = THIS_MODULE;
10411074
uverbs_dev->cdev.ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops;
@@ -1055,23 +1088,6 @@ static void ib_uverbs_add_one(struct ib_device *device)
10551088
if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
10561089
goto err_class;
10571090

1058-
if (!device->driver_specs_root) {
1059-
const struct uverbs_object_tree_def *default_root[] = {
1060-
uverbs_default_get_objects()};
1061-
1062-
uverbs_dev->specs_root = uverbs_alloc_spec_tree(1,
1063-
default_root);
1064-
if (IS_ERR(uverbs_dev->specs_root))
1065-
goto err_class;
1066-
} else {
1067-
uverbs_dev->specs_root = device->driver_specs_root;
1068-
/*
1069-
* Take responsibility to free the specs allocated by the
1070-
* driver.
1071-
*/
1072-
device->driver_specs_root = NULL;
1073-
}
1074-
10751091
ib_set_client_data(device, &uverbs_client, uverbs_dev);
10761092

10771093
return;

drivers/infiniband/core/uverbs_std_types.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,4 +316,3 @@ const struct uverbs_object_tree_def *uverbs_default_get_objects(void)
316316
{
317317
return &uverbs_default_objects;
318318
}
319-
EXPORT_SYMBOL_GPL(uverbs_default_get_objects);

drivers/infiniband/hw/mlx5/main.c

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5523,37 +5523,29 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE(
55235523
UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_CREATE_FLOW_ACTION_FLAGS,
55245524
enum mlx5_ib_uapi_flow_action_flags));
55255525

5526-
#define NUM_TREES 5
55275526
static int populate_specs_root(struct mlx5_ib_dev *dev)
55285527
{
5529-
const struct uverbs_object_tree_def *default_root[NUM_TREES + 1] = {
5530-
uverbs_default_get_objects()};
5531-
size_t num_trees = 1;
5528+
const struct uverbs_object_tree_def **trees = dev->driver_trees;
5529+
size_t num_trees = 0;
55325530

5533-
if (mlx5_accel_ipsec_device_caps(dev->mdev) & MLX5_ACCEL_IPSEC_CAP_DEVICE &&
5534-
!WARN_ON(num_trees >= ARRAY_SIZE(default_root)))
5535-
default_root[num_trees++] = &mlx5_ib_flow_action;
5531+
if (mlx5_accel_ipsec_device_caps(dev->mdev) &
5532+
MLX5_ACCEL_IPSEC_CAP_DEVICE)
5533+
trees[num_trees++] = &mlx5_ib_flow_action;
55365534

5537-
if (MLX5_CAP_DEV_MEM(dev->mdev, memic) &&
5538-
!WARN_ON(num_trees >= ARRAY_SIZE(default_root)))
5539-
default_root[num_trees++] = &mlx5_ib_dm;
5535+
if (MLX5_CAP_DEV_MEM(dev->mdev, memic))
5536+
trees[num_trees++] = &mlx5_ib_dm;
55405537

55415538
if (MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
5542-
MLX5_GENERAL_OBJ_TYPES_CAP_UCTX &&
5543-
!WARN_ON(num_trees >= ARRAY_SIZE(default_root)))
5544-
default_root[num_trees++] = mlx5_ib_get_devx_tree();
5539+
MLX5_GENERAL_OBJ_TYPES_CAP_UCTX)
5540+
trees[num_trees++] = mlx5_ib_get_devx_tree();
55455541

5546-
num_trees += mlx5_ib_get_flow_trees(default_root + num_trees);
5542+
num_trees += mlx5_ib_get_flow_trees(trees + num_trees);
55475543

5548-
dev->ib_dev.driver_specs_root =
5549-
uverbs_alloc_spec_tree(num_trees, default_root);
5544+
WARN_ON(num_trees >= ARRAY_SIZE(dev->driver_trees));
5545+
trees[num_trees] = NULL;
5546+
dev->ib_dev.driver_specs = trees;
55505547

5551-
return PTR_ERR_OR_ZERO(dev->ib_dev.driver_specs_root);
5552-
}
5553-
5554-
static void depopulate_specs_root(struct mlx5_ib_dev *dev)
5555-
{
5556-
uverbs_free_spec_tree(dev->ib_dev.driver_specs_root);
5548+
return 0;
55575549
}
55585550

55595551
static int mlx5_ib_read_counters(struct ib_counters *counters,
@@ -6092,11 +6084,6 @@ int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev)
60926084
return ib_register_device(&dev->ib_dev, NULL);
60936085
}
60946086

6095-
static void mlx5_ib_stage_depopulate_specs(struct mlx5_ib_dev *dev)
6096-
{
6097-
depopulate_specs_root(dev);
6098-
}
6099-
61006087
void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev)
61016088
{
61026089
destroy_umrc_res(dev);
@@ -6231,7 +6218,7 @@ static const struct mlx5_ib_profile pf_profile = {
62316218
mlx5_ib_stage_pre_ib_reg_umr_cleanup),
62326219
STAGE_CREATE(MLX5_IB_STAGE_SPECS,
62336220
mlx5_ib_stage_populate_specs,
6234-
mlx5_ib_stage_depopulate_specs),
6221+
NULL),
62356222
STAGE_CREATE(MLX5_IB_STAGE_IB_REG,
62366223
mlx5_ib_stage_ib_reg_init,
62376224
mlx5_ib_stage_ib_reg_cleanup),
@@ -6279,7 +6266,7 @@ static const struct mlx5_ib_profile nic_rep_profile = {
62796266
mlx5_ib_stage_pre_ib_reg_umr_cleanup),
62806267
STAGE_CREATE(MLX5_IB_STAGE_SPECS,
62816268
mlx5_ib_stage_populate_specs,
6282-
mlx5_ib_stage_depopulate_specs),
6269+
NULL),
62836270
STAGE_CREATE(MLX5_IB_STAGE_IB_REG,
62846271
mlx5_ib_stage_ib_reg_init,
62856272
mlx5_ib_stage_ib_reg_cleanup),

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,7 @@ to_mcounters(struct ib_counters *ibcntrs)
860860

861861
struct mlx5_ib_dev {
862862
struct ib_device ib_dev;
863+
const struct uverbs_object_tree_def *driver_trees[6];
863864
struct mlx5_core_dev *mdev;
864865
struct mlx5_roce roce[MLX5_MAX_PORTS];
865866
int num_ports;

include/rdma/ib_verbs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2580,7 +2580,7 @@ struct ib_device {
25802580
const struct cpumask *(*get_vector_affinity)(struct ib_device *ibdev,
25812581
int comp_vector);
25822582

2583-
struct uverbs_root_spec *driver_specs_root;
2583+
const struct uverbs_object_tree_def *const *driver_specs;
25842584
enum rdma_driver_id driver_id;
25852585
};
25862586

0 commit comments

Comments
 (0)