vfio/mdev: Add mdev/mtype_get_type_group_id()
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 6 Apr 2021 19:40:34 +0000 (16:40 -0300)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 7 Apr 2021 21:39:18 +0000 (15:39 -0600)
This returns the index in the supported_type_groups array that is
associated with the mdev_type attached to the struct mdev_device or its
containing struct kobject.

Each mdev_device can be spawned from exactly one mdev_type, which in turn
originates from exactly one supported_type_group.

Drivers are using weird string calculations to try and get back to this
index, providing a direct access to the index removes a bunch of wonky
driver code.

mdev_type->group can be deleted as the group is obtained using the
type_group_id.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Message-Id: <11-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/mdev_private.h
drivers/vfio/mdev/mdev_sysfs.c
include/linux/mdev.h

index 2a20bdaf6142143f2e6376152762b7287f4f606d..5ae06f951a099828d9ba371bf425979ff84469fa 100644 (file)
@@ -33,6 +33,26 @@ struct device *mdev_parent_dev(struct mdev_device *mdev)
 }
 EXPORT_SYMBOL(mdev_parent_dev);
 
+/*
+ * Return the index in supported_type_groups that this mdev_device was created
+ * from.
+ */
+unsigned int mdev_get_type_group_id(struct mdev_device *mdev)
+{
+       return mdev->type->type_group_id;
+}
+EXPORT_SYMBOL(mdev_get_type_group_id);
+
+/*
+ * Used in mdev_type_attribute sysfs functions to return the index in the
+ * supported_type_groups that the sysfs is called from.
+ */
+unsigned int mtype_get_type_group_id(struct kobject *mtype_kobj)
+{
+       return container_of(mtype_kobj, struct mdev_type, kobj)->type_group_id;
+}
+EXPORT_SYMBOL(mtype_get_type_group_id);
+
 /* Should be called holding parent_list_lock */
 static struct mdev_parent *__find_parent_device(struct device *dev)
 {
index fddab240ccc37edfec3fce8cfa8664b5e2782443..6999c89db7b1627a95f33ba652b1659c8a6b84f7 100644 (file)
@@ -29,7 +29,7 @@ struct mdev_type {
        struct kobject *devices_kobj;
        struct mdev_parent *parent;
        struct list_head next;
-       struct attribute_group *group;
+       unsigned int type_group_id;
 };
 
 #define to_mdev_type_attr(_attr)       \
index 8c169d12ba7dbb904eb852308c9cb58ebe6a6178..712fbc78b12e2dd04102aee2e7df68bbfaa0bc89 100644 (file)
@@ -92,9 +92,11 @@ static struct kobj_type mdev_type_ktype = {
 };
 
 static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
-                                                struct attribute_group *group)
+                                                unsigned int type_group_id)
 {
        struct mdev_type *type;
+       struct attribute_group *group =
+               parent->ops->supported_type_groups[type_group_id];
        int ret;
 
        if (!group->name) {
@@ -110,6 +112,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
        type->parent = parent;
        /* Pairs with the put in mdev_type_release() */
        mdev_get_parent(parent);
+       type->type_group_id = type_group_id;
 
        ret = kobject_init_and_add(&type->kobj, &mdev_type_ktype, NULL,
                                   "%s-%s", dev_driver_string(parent->dev),
@@ -135,8 +138,6 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
                ret = -ENOMEM;
                goto attrs_failed;
        }
-
-       type->group = group;
        return type;
 
 attrs_failed:
@@ -151,8 +152,11 @@ attr_create_failed:
 
 static void remove_mdev_supported_type(struct mdev_type *type)
 {
+       struct attribute_group *group =
+               type->parent->ops->supported_type_groups[type->type_group_id];
+
        sysfs_remove_files(&type->kobj,
-                          (const struct attribute **)type->group->attrs);
+                          (const struct attribute **)group->attrs);
        kobject_put(type->devices_kobj);
        sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr);
        kobject_del(&type->kobj);
@@ -166,8 +170,7 @@ static int add_mdev_supported_type_groups(struct mdev_parent *parent)
        for (i = 0; parent->ops->supported_type_groups[i]; i++) {
                struct mdev_type *type;
 
-               type = add_mdev_supported_type(parent,
-                                       parent->ops->supported_type_groups[i]);
+               type = add_mdev_supported_type(parent, i);
                if (IS_ERR(type)) {
                        struct mdev_type *ltype, *tmp;
 
index fb582adda28a9bd2f6d8a8611278b8e0981f7577..41e9193652239446ea48d000192f55e5cb0565d4 100644 (file)
@@ -46,6 +46,9 @@ static inline struct device *mdev_get_iommu_device(struct mdev_device *mdev)
        return mdev->iommu_device;
 }
 
+unsigned int mdev_get_type_group_id(struct mdev_device *mdev);
+unsigned int mtype_get_type_group_id(struct kobject *mtype_kobj);
+
 /**
  * struct mdev_parent_ops - Structure to be registered for each parent device to
  * register the device to mdev module.