RE: [PATCH 10/18] vfio/mdev: Remove duplicate storage of parent in mdev_device

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

 



> From: Jason Gunthorpe <jgg@xxxxxxxxxx>
> Sent: Wednesday, March 24, 2021 1:55 AM
> 
> mdev_device->type->parent is the same thing.
> 
> The struct mdev_device was relying on the kref on the mdev_parent to also
> indirectly hold a kref on the mdev_type pointer. Now that the type holds a
> kref on the parent we can directly kref the mdev_type and remove this
> implicit relationship.
> 
> Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
> ---
>  drivers/vfio/mdev/mdev_core.c | 13 +++++--------
>  drivers/vfio/mdev/vfio_mdev.c | 14 +++++++-------
>  include/linux/mdev.h          |  1 -
>  3 files changed, 12 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/vfio/mdev/mdev_core.c
> b/drivers/vfio/mdev/mdev_core.c
> index 4b5e372ed58f26..493df3da451339 100644
> --- a/drivers/vfio/mdev/mdev_core.c
> +++ b/drivers/vfio/mdev/mdev_core.c
> @@ -29,7 +29,7 @@ static DEFINE_MUTEX(mdev_list_lock);
> 
>  struct device *mdev_parent_dev(struct mdev_device *mdev)
>  {
> -	return mdev->parent->dev;
> +	return mdev->type->parent->dev;
>  }
>  EXPORT_SYMBOL(mdev_parent_dev);
> 
> @@ -58,12 +58,11 @@ void mdev_release_parent(struct kref *kref)
>  /* Caller must hold parent unreg_sem read or write lock */
>  static void mdev_device_remove_common(struct mdev_device *mdev)
>  {
> -	struct mdev_parent *parent;
> +	struct mdev_parent *parent = mdev->type->parent;

What about having a wrapper here, like mdev_parent_dev? For
readability it's not necessary to show that the parent is indirectly
retrieved through mdev_type.

>  	int ret;
> 
>  	mdev_remove_sysfs_files(mdev);
>  	device_del(&mdev->dev);
> -	parent = mdev->parent;
>  	lockdep_assert_held(&parent->unreg_sem);
>  	ret = parent->ops->remove(mdev);
>  	if (ret)
> @@ -212,7 +211,7 @@ static void mdev_device_release(struct device *dev)
>  	struct mdev_device *mdev = to_mdev_device(dev);
> 
>  	/* Pairs with the get in mdev_device_create() */
> -	mdev_put_parent(mdev->parent);
> +	kobject_put(&mdev->type->kobj);

Maybe keep mdev_get/put_parent and change them to accept "struct
mdev_device *" parameter like other places.

> 
>  	mutex_lock(&mdev_list_lock);
>  	list_del(&mdev->next);
> @@ -250,9 +249,8 @@ int mdev_device_create(struct mdev_type *type,
> const guid_t *uuid)
>  	mdev->dev.release = mdev_device_release;
>  	mdev->dev.groups = parent->ops->mdev_attr_groups;
>  	mdev->type = type;
> -	mdev->parent = parent;
>  	/* Pairs with the put in mdev_device_release() */
> -	mdev_get_parent(parent);
> +	kobject_get(&type->kobj);
> 
>  	guid_copy(&mdev->uuid, uuid);
>  	list_add(&mdev->next, &mdev_list);
> @@ -300,7 +298,7 @@ int mdev_device_create(struct mdev_type *type,
> const guid_t *uuid)
>  int mdev_device_remove(struct mdev_device *mdev)
>  {
>  	struct mdev_device *tmp;
> -	struct mdev_parent *parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	mutex_lock(&mdev_list_lock);
>  	list_for_each_entry(tmp, &mdev_list, next) {
> @@ -321,7 +319,6 @@ int mdev_device_remove(struct mdev_device *mdev)
>  	mdev->active = false;
>  	mutex_unlock(&mdev_list_lock);
> 
> -	parent = mdev->parent;
>  	/* Check if parent unregistration has started */
>  	if (!down_read_trylock(&parent->unreg_sem))
>  		return -ENODEV;
> diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_mdev.c
> index cc9507ed85a181..922729071c5a8e 100644
> --- a/drivers/vfio/mdev/vfio_mdev.c
> +++ b/drivers/vfio/mdev/vfio_mdev.c
> @@ -24,7 +24,7 @@
>  static int vfio_mdev_open(struct vfio_device *core_vdev)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	int ret;
> 
> @@ -44,7 +44,7 @@ static int vfio_mdev_open(struct vfio_device
> *core_vdev)
>  static void vfio_mdev_release(struct vfio_device *core_vdev)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (likely(parent->ops->release))
>  		parent->ops->release(mdev);
> @@ -56,7 +56,7 @@ static long vfio_mdev_unlocked_ioctl(struct vfio_device
> *core_vdev,
>  				     unsigned int cmd, unsigned long arg)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (unlikely(!parent->ops->ioctl))
>  		return -EINVAL;
> @@ -68,7 +68,7 @@ static ssize_t vfio_mdev_read(struct vfio_device
> *core_vdev, char __user *buf,
>  			      size_t count, loff_t *ppos)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (unlikely(!parent->ops->read))
>  		return -EINVAL;
> @@ -81,7 +81,7 @@ static ssize_t vfio_mdev_write(struct vfio_device
> *core_vdev,
>  			       loff_t *ppos)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (unlikely(!parent->ops->write))
>  		return -EINVAL;
> @@ -93,7 +93,7 @@ static int vfio_mdev_mmap(struct vfio_device
> *core_vdev,
>  			  struct vm_area_struct *vma)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (unlikely(!parent->ops->mmap))
>  		return -EINVAL;
> @@ -104,7 +104,7 @@ static int vfio_mdev_mmap(struct vfio_device
> *core_vdev,
>  static void vfio_mdev_request(struct vfio_device *core_vdev, unsigned int
> count)
>  {
>  	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
> -	struct mdev_parent *parent = mdev->parent;
> +	struct mdev_parent *parent = mdev->type->parent;
> 
>  	if (parent->ops->request)
>  		parent->ops->request(mdev, count);
> diff --git a/include/linux/mdev.h b/include/linux/mdev.h
> index 349e8ac1fe3382..fb582adda28a9b 100644
> --- a/include/linux/mdev.h
> +++ b/include/linux/mdev.h
> @@ -14,7 +14,6 @@ struct mdev_type;
> 
>  struct mdev_device {
>  	struct device dev;
> -	struct mdev_parent *parent;
>  	guid_t uuid;
>  	void *driver_data;
>  	struct list_head next;
> --
> 2.31.0





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux