Re: [PATCH 01/10] IB/uverbs: Have the core code create the uverbs_root_spec

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Aug 03, 2018 at 01:31:34PM -0600, Jason Gunthorpe wrote:
> From: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
>
> 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 <jgg@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/core/uverbs_ioctl_merge.c |  2 -
>  drivers/infiniband/core/uverbs_main.c        | 50 +++++++++++++-------
>  drivers/infiniband/core/uverbs_std_types.c   |  1 -
>  drivers/infiniband/hw/mlx5/main.c            | 45 +++++++-----------
>  drivers/infiniband/hw/mlx5/mlx5_ib.h         |  1 +
>  include/rdma/ib_verbs.h                      |  2 +-
>  6 files changed, 51 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/infiniband/core/uverbs_ioctl_merge.c b/drivers/infiniband/core/uverbs_ioctl_merge.c
> index f81aa888ce5c4c..16b57592991581 100644
> --- a/drivers/infiniband/core/uverbs_ioctl_merge.c
> +++ b/drivers/infiniband/core/uverbs_ioctl_merge.c
> @@ -556,7 +556,6 @@ void uverbs_free_spec_tree(struct uverbs_root_spec *root)
>
>  	kfree(root);
>  }
> -EXPORT_SYMBOL(uverbs_free_spec_tree);
>
>  struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
>  						const struct uverbs_object_tree_def **trees)
> @@ -661,4 +660,3 @@ struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
>  	uverbs_free_spec_tree(root_spec);
>  	return ERR_PTR(res);
>  }
> -EXPORT_SYMBOL(uverbs_alloc_spec_tree);
> diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
> index 6f62146e9738a0..20003594b5d6a7 100644
> --- a/drivers/infiniband/core/uverbs_main.c
> +++ b/drivers/infiniband/core/uverbs_main.c
> @@ -994,6 +994,36 @@ static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
>  static CLASS_ATTR_STRING(abi_version, S_IRUGO,
>  			 __stringify(IB_USER_VERBS_ABI_VERSION));
>
> +static int ib_uverbs_create_uapi(struct ib_device *device,
> +				 struct ib_uverbs_device *uverbs_dev)
> +{
> +	const struct uverbs_object_tree_def **specs;
> +	struct uverbs_root_spec *specs_root;
> +	unsigned int num_specs = 1;
> +	unsigned int i;
> +
> +	if (device->driver_specs)
> +		for (i = 0; device->driver_specs[i]; i++)
> +			num_specs++;
> +
> +	specs = kmalloc_array(num_specs, sizeof(*specs), GFP_KERNEL);
> +	if (!specs)
> +		return -ENOMEM;
> +
> +	specs[0] = uverbs_default_get_objects();
> +	if (device->driver_specs)
> +		for (i = 0; device->driver_specs[i]; i++)
> +			specs[i+1] = device->driver_specs[i];
> +
> +	specs_root = uverbs_alloc_spec_tree(num_specs, specs);
> +	kfree(specs);
> +	if (IS_ERR(specs_root))
> +		return PTR_ERR(specs_root);
> +
> +	uverbs_dev->specs_root = specs_root;
> +	return 0;
> +}
> +
>  static void ib_uverbs_add_one(struct ib_device *device)
>  {
>  	int devnum;
> @@ -1036,6 +1066,9 @@ static void ib_uverbs_add_one(struct ib_device *device)
>  	rcu_assign_pointer(uverbs_dev->ib_dev, device);
>  	uverbs_dev->num_comp_vectors = device->num_comp_vectors;
>
> +	if (ib_uverbs_create_uapi(device, uverbs_dev))
> +		goto err;
> +
>  	cdev_init(&uverbs_dev->cdev, NULL);
>  	uverbs_dev->cdev.owner = THIS_MODULE;
>  	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)
>  	if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
>  		goto err_class;
>
> -	if (!device->driver_specs_root) {
> -		const struct uverbs_object_tree_def *default_root[] = {
> -			uverbs_default_get_objects()};
> -
> -		uverbs_dev->specs_root = uverbs_alloc_spec_tree(1,
> -								default_root);
> -		if (IS_ERR(uverbs_dev->specs_root))
> -			goto err_class;
> -	} else {
> -		uverbs_dev->specs_root = device->driver_specs_root;
> -		/*
> -		 * Take responsibility to free the specs allocated by the
> -		 * driver.
> -		 */
> -		device->driver_specs_root = NULL;
> -	}
> -
>  	ib_set_client_data(device, &uverbs_client, uverbs_dev);
>
>  	return;
> diff --git a/drivers/infiniband/core/uverbs_std_types.c b/drivers/infiniband/core/uverbs_std_types.c
> index 3aa7c7deac749a..7f22b820a21ba0 100644
> --- a/drivers/infiniband/core/uverbs_std_types.c
> +++ b/drivers/infiniband/core/uverbs_std_types.c
> @@ -316,4 +316,3 @@ const struct uverbs_object_tree_def *uverbs_default_get_objects(void)
>  {
>  	return &uverbs_default_objects;
>  }
> -EXPORT_SYMBOL_GPL(uverbs_default_get_objects);
> diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
> index 13744b4631b452..f86d831ee27c5d 100644
> --- a/drivers/infiniband/hw/mlx5/main.c
> +++ b/drivers/infiniband/hw/mlx5/main.c
> @@ -5523,37 +5523,29 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE(
>  	UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_CREATE_FLOW_ACTION_FLAGS,
>  			     enum mlx5_ib_uapi_flow_action_flags));
>
> -#define NUM_TREES	5
>  static int populate_specs_root(struct mlx5_ib_dev *dev)
>  {
> -	const struct uverbs_object_tree_def *default_root[NUM_TREES + 1] = {
> -		uverbs_default_get_objects()};
> -	size_t num_trees = 1;
> +	const struct uverbs_object_tree_def **trees = dev->driver_trees;
> +	size_t num_trees = 0;

<...>

> --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
> +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
> @@ -860,6 +860,7 @@ to_mcounters(struct ib_counters *ibcntrs)
>
>  struct mlx5_ib_dev {
>  	struct ib_device		ib_dev;
> +	const struct uverbs_object_tree_def *driver_trees[6];

Isn't this need to be "5" and not "6"? You moved one tree entry to core.

Thanks

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux