RE: [PATCH 1/9] RDMA/uverbs: Store the specs_root in the struct ib_uverbs_device

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

 



>-----Original Message-----
>From: Jason Gunthorpe [mailto:jgg@xxxxxxxx]
>Sent: Monday, June 25, 2018 6:13 PM
>To: linux-rdma@xxxxxxxxxxxxxxx
>Cc: Ruhl, Michael J <michael.j.ruhl@xxxxxxxxx>; Leon Romanovsky
><leonro@xxxxxxxxxxxx>; Guy Levi <guyle@xxxxxxxxxxxx>; Jason
>Gunthorpe <jgg@xxxxxxxxxxxx>
>Subject: [PATCH 1/9] RDMA/uverbs: Store the specs_root in the struct
>ib_uverbs_device
>
>From: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
>
>The specs are required to operate the uverbs file, so they belong inside
>the ib_uverbs_device, not inside the ib_device. The spec passed in the
>ib_device is just a communication from the driver and should not be used
>during runtime.
>
>This also changes the lifetime of the spec memory to match the
>ib_uverbs_device, however at this time the spec_root can still contain
>driver pointers after disassociation, so it cannot be used if ib_dev is
>NULL. This is preparation for another series.
>
>Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
>---
> drivers/infiniband/core/rdma_core.c    |  4 ++--
> drivers/infiniband/core/rdma_core.h    |  2 +-
> drivers/infiniband/core/uverbs_ioctl.c | 26 ++++++++++++--------------
> drivers/infiniband/core/uverbs_main.c  | 16 +++++++++-------
> drivers/infiniband/hw/mlx5/main.c      |  6 +++---
> include/rdma/ib_verbs.h                |  2 +-
> 6 files changed, 28 insertions(+), 28 deletions(-)
>
>diff --git a/drivers/infiniband/core/rdma_core.c
>b/drivers/infiniband/core/rdma_core.c
>index df3c405332525a..35ab553568e748 100644
>--- a/drivers/infiniband/core/rdma_core.c
>+++ b/drivers/infiniband/core/rdma_core.c
>@@ -52,10 +52,10 @@ int uverbs_ns_idx(u16 *id, unsigned int ns_count)
> 	return ret;
> }
>
>-const struct uverbs_object_spec *uverbs_get_object(const struct ib_device
>*ibdev,
>+const struct uverbs_object_spec *uverbs_get_object(struct ib_uverbs_file
>*ufile,
> 						   uint16_t object)
> {
>-	const struct uverbs_root_spec *object_hash = ibdev->specs_root;
>+	const struct uverbs_root_spec *object_hash = ufile->device-
>>specs_root;
> 	const struct uverbs_object_spec_hash *objects;
> 	int ret = uverbs_ns_idx(&object, object_hash->num_buckets);
>
>diff --git a/drivers/infiniband/core/rdma_core.h
>b/drivers/infiniband/core/rdma_core.h
>index a243cc2a59f76d..b8943f47caba84 100644
>--- a/drivers/infiniband/core/rdma_core.h
>+++ b/drivers/infiniband/core/rdma_core.h
>@@ -44,7 +44,7 @@
> #include <linux/mutex.h>
>
> int uverbs_ns_idx(u16 *id, unsigned int ns_count);
>-const struct uverbs_object_spec *uverbs_get_object(const struct ib_device
>*ibdev,
>+const struct uverbs_object_spec *uverbs_get_object(struct ib_uverbs_file
>*ibdev,
     ^^^^^
s/ibdev/ufile?

Reviewed-by: Michael J. Ruhl <michael.j.ruhl@xxxxxxxxx>

Mike

> 						   uint16_t object);
> const struct uverbs_method_spec *uverbs_get_method(const struct
>uverbs_object_spec *object,
> 						   uint16_t method);
>diff --git a/drivers/infiniband/core/uverbs_ioctl.c
>b/drivers/infiniband/core/uverbs_ioctl.c
>index 03065bad8dae8c..785975a4e3ddaa 100644
>--- a/drivers/infiniband/core/uverbs_ioctl.c
>+++ b/drivers/infiniband/core/uverbs_ioctl.c
>@@ -46,8 +46,7 @@ static bool uverbs_is_attr_cleared(const struct
>ib_uverbs_attr *uattr,
> 			   0, uattr->len - len);
> }
>
>-static int uverbs_process_attr(struct ib_device *ibdev,
>-			       struct ib_ucontext *ucontext,
>+static int uverbs_process_attr(struct ib_uverbs_file *ufile,
> 			       const struct ib_uverbs_attr *uattr,
> 			       u16 attr_id,
> 			       const struct uverbs_attr_spec_hash
>*attr_spec_bucket,
>@@ -145,17 +144,18 @@ static int uverbs_process_attr(struct ib_device
>*ibdev,
> 		if (uattr->attr_data.reserved)
> 			return -EINVAL;
>
>-		if (uattr->len != 0 || !ucontext || uattr->data > INT_MAX)
>+		if (uattr->len != 0 || !ufile->ucontext ||
>+		    uattr->data > INT_MAX)
> 			return -EINVAL;
>
> 		o_attr = &e->obj_attr;
>-		object = uverbs_get_object(ibdev, spec->obj.obj_type);
>+		object = uverbs_get_object(ufile, spec->obj.obj_type);
> 		if (!object)
> 			return -EINVAL;
>
> 		o_attr->uobject = uverbs_get_uobject_from_context(
> 					object->type_attrs,
>-					ucontext,
>+					ufile->ucontext,
> 					spec->obj.access,
> 					(int)uattr->data);
>
>@@ -230,8 +230,7 @@ static int uverbs_finalize_attrs(struct
>uverbs_attr_bundle *attrs_bundle,
> 	return ret;
> }
>
>-static int uverbs_uattrs_process(struct ib_device *ibdev,
>-				 struct ib_ucontext *ucontext,
>+static int uverbs_uattrs_process(struct ib_uverbs_file *ufile,
> 				 const struct ib_uverbs_attr *uattrs,
> 				 size_t num_uattrs,
> 				 const struct uverbs_method_spec *method,
>@@ -267,9 +266,9 @@ static int uverbs_uattrs_process(struct ib_device
>*ibdev,
> 			num_given_buckets = ret + 1;
>
> 		attr_spec_bucket = method->attr_buckets[ret];
>-		ret = uverbs_process_attr(ibdev, ucontext, uattr, attr_id,
>-					  attr_spec_bucket, &attr_bundle-
>>hash[ret],
>-					  uattr_ptr++);
>+		ret = uverbs_process_attr(ufile, uattr, attr_id,
>+					  attr_spec_bucket,
>+					  &attr_bundle->hash[ret],
>uattr_ptr++);
> 		if (ret) {
> 			uverbs_finalize_attrs(attr_bundle,
> 					      method->attr_buckets,
>@@ -324,9 +323,8 @@ static int uverbs_handle_method(struct
>ib_uverbs_attr __user *uattr_ptr,
> 	int finalize_ret;
> 	int num_given_buckets;
>
>-	num_given_buckets = uverbs_uattrs_process(ibdev, ufile->ucontext,
>uattrs,
>-						  num_uattrs, method_spec,
>-						  attr_bundle, uattr_ptr);
>+	num_given_buckets = uverbs_uattrs_process(
>+		ufile, uattrs, num_uattrs, method_spec, attr_bundle,
>uattr_ptr);
> 	if (num_given_buckets <= 0)
> 		return -EINVAL;
>
>@@ -367,7 +365,7 @@ static long ib_uverbs_cmd_verbs(struct ib_device
>*ib_dev,
> 	if (hdr->driver_id != ib_dev->driver_id)
> 		return -EINVAL;
>
>-	object_spec = uverbs_get_object(ib_dev, hdr->object_id);
>+	object_spec = uverbs_get_object(file, hdr->object_id);
> 	if (!object_spec)
> 		return -EPROTONOSUPPORT;
>
>diff --git a/drivers/infiniband/core/uverbs_main.c
>b/drivers/infiniband/core/uverbs_main.c
>index f5f4bfb59705b6..c05ce5ae5415b6 100644
>--- a/drivers/infiniband/core/uverbs_main.c
>+++ b/drivers/infiniband/core/uverbs_main.c
>@@ -161,6 +161,7 @@ static void ib_uverbs_release_dev(struct kobject
>*kobj)
> 		container_of(kobj, struct ib_uverbs_device, kobj);
>
> 	cleanup_srcu_struct(&dev->disassociate_srcu);
>+	uverbs_free_spec_tree(dev->specs_root);
> 	kfree(dev);
> }
>
>@@ -1067,7 +1068,7 @@ 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->specs_root) {
>+	if (!device->driver_specs_root) {
> 		const struct uverbs_object_tree_def *default_root[] = {
> 			uverbs_default_get_objects()};
>
>@@ -1075,8 +1076,13 @@ static void ib_uverbs_add_one(struct ib_device
>*device)
> 								default_root);
> 		if (IS_ERR(uverbs_dev->specs_root))
> 			goto err_class;
>-
>-		device->specs_root = uverbs_dev->specs_root;
>+	} 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);
>@@ -1241,10 +1247,6 @@ static void ib_uverbs_remove_one(struct
>ib_device *device, void *client_data)
> 		ib_uverbs_comp_dev(uverbs_dev);
> 	if (wait_clients)
> 		wait_for_completion(&uverbs_dev->comp);
>-	if (uverbs_dev->specs_root) {
>-		uverbs_free_spec_tree(uverbs_dev->specs_root);
>-		device->specs_root = NULL;
>-	}
>
> 	kobject_put(&uverbs_dev->kobj);
> }
>diff --git a/drivers/infiniband/hw/mlx5/main.c
>b/drivers/infiniband/hw/mlx5/main.c
>index b4e8173f32391d..a8294a89680704 100644
>--- a/drivers/infiniband/hw/mlx5/main.c
>+++ b/drivers/infiniband/hw/mlx5/main.c
>@@ -5342,15 +5342,15 @@ static int populate_specs_root(struct mlx5_ib_dev
>*dev)
> 	    !WARN_ON(num_trees >= ARRAY_SIZE(default_root)))
> 		default_root[num_trees++] = mlx5_ib_get_devx_tree();
>
>-	dev->ib_dev.specs_root =
>+	dev->ib_dev.driver_specs_root =
> 		uverbs_alloc_spec_tree(num_trees, default_root);
>
>-	return PTR_ERR_OR_ZERO(dev->ib_dev.specs_root);
>+	return PTR_ERR_OR_ZERO(dev->ib_dev.driver_specs_root);
> }
>
> static void depopulate_specs_root(struct mlx5_ib_dev *dev)
> {
>-	uverbs_free_spec_tree(dev->ib_dev.specs_root);
>+	uverbs_free_spec_tree(dev->ib_dev.driver_specs_root);
> }
>
> static int mlx5_ib_read_counters(struct ib_counters *counters,
>diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
>index 995d517c0a7654..7a17eddec13d8f 100644
>--- a/include/rdma/ib_verbs.h
>+++ b/include/rdma/ib_verbs.h
>@@ -2598,7 +2598,7 @@ struct ib_device {
> 	const struct cpumask *(*get_vector_affinity)(struct ib_device *ibdev,
> 						     int comp_vector);
>
>-	struct uverbs_root_spec		*specs_root;
>+	struct uverbs_root_spec		*driver_specs_root;
> 	enum rdma_driver_id		driver_id;
> };
>
>--
>2.17.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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