vfio/mdev: Remove duplicate storage of parent in mdev_device
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 6 Apr 2021 19:40:33 +0000 (16:40 -0300)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 7 Apr 2021 21:39:18 +0000 (15:39 -0600)
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.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Message-Id: <10-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/mdev/mdev_core.c
drivers/vfio/mdev/vfio_mdev.c
include/linux/mdev.h

index 4caedb3..2a20bda 100644 (file)
@@ -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;
        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);
 
        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 @@ out_put_device:
 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;
index cc9507e..9227290 100644 (file)
@@ -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);
index 349e8ac..fb582ad 100644 (file)
@@ -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;