vfio/mdev: Remove mdev_parent_ops
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 11 Apr 2022 14:14:01 +0000 (16:14 +0200)
committerZhi Wang <zhi.a.wang@intel.com>
Thu, 21 Apr 2022 11:36:56 +0000 (07:36 -0400)
The last useful member in this struct is the supported_type_groups, move
it to the mdev_driver and delete mdev_parent_ops.

Replace it with mdev_driver as an argument to mdev_register_device()

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20220411141403.86980-33-hch@lst.de
Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com>
Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>
Documentation/driver-api/vfio-mediated-device.rst
drivers/gpu/drm/i915/gvt/kvmgt.c
drivers/s390/cio/vfio_ccw_ops.c
drivers/s390/crypto/vfio_ap_ops.c
drivers/vfio/mdev/mdev_core.c
drivers/vfio/mdev/mdev_private.h
drivers/vfio/mdev/mdev_sysfs.c
include/linux/mdev.h
samples/vfio-mdev/mbochs.c
samples/vfio-mdev/mdpy.c
samples/vfio-mdev/mtty.c

index 5a6e18a651a181dd04e8bad13e77ed5c693d6708..784bbeb22adcf559e5b8d0e679560bfe2391cc28 100644 (file)
@@ -105,6 +105,7 @@ structure to represent a mediated device's driver::
      struct mdev_driver {
             int  (*probe)  (struct mdev_device *dev);
             void (*remove) (struct mdev_device *dev);
+            struct attribute_group **supported_type_groups;
             struct device_driver    driver;
      };
 
@@ -119,30 +120,15 @@ to register and unregister itself with the core driver:
 
     extern void mdev_unregister_driver(struct mdev_driver *drv);
 
-The mediated bus driver is responsible for adding mediated devices to the VFIO
-group when devices are bound to the driver and removing mediated devices from
-the VFIO when devices are unbound from the driver.
-
-
-Physical Device Driver Interface
---------------------------------
-
-The physical device driver interface provides the mdev_parent_ops[3] structure
-to define the APIs to manage work in the mediated core driver that is related
-to the physical device.
-
-The structures in the mdev_parent_ops structure are as follows:
-
-* dev_attr_groups: attributes of the parent device
-* mdev_attr_groups: attributes of the mediated device
-* supported_config: attributes to define supported configurations
-* device_driver: device driver to bind for mediated device instances
+The mediated bus driver's probe function should create a vfio_device on top of
+the mdev_device and connect it to an appropriate implementation of
+vfio_device_ops.
 
 When a driver wants to add the GUID creation sysfs to an existing device it has
 probe'd to then it should call::
 
        extern int  mdev_register_device(struct device *dev,
-                                        const struct mdev_parent_ops *ops);
+                                        struct mdev_driver *mdev_driver);
 
 This will provide the 'mdev_supported_types/XX/create' files which can then be
 used to trigger the creation of a mdev_device. The created mdev_device will be
index f033031c676da49f2f9491590fc9f0f23d4859d7..0787ba5c301f5ecff4ef6e34a969018a0a123605 100644 (file)
@@ -1723,12 +1723,7 @@ static struct mdev_driver intel_vgpu_mdev_driver = {
        },
        .probe          = intel_vgpu_probe,
        .remove         = intel_vgpu_remove,
-};
-
-static const struct mdev_parent_ops intel_vgpu_mdev_ops = {
-       .owner                  = THIS_MODULE,
        .supported_type_groups  = gvt_vgpu_type_groups,
-       .device_driver          = &intel_vgpu_mdev_driver,
 };
 
 int intel_gvt_page_track_add(struct intel_vgpu *info, u64 gfn)
@@ -2131,7 +2126,7 @@ static int intel_gvt_init_device(struct drm_i915_private *i915)
        if (ret)
                goto out_destroy_idle_vgpu;
 
-       ret = mdev_register_device(i915->drm.dev, &intel_vgpu_mdev_ops);
+       ret = mdev_register_device(i915->drm.dev, &intel_vgpu_mdev_driver);
        if (ret)
                goto out_cleanup_vgpu_type_groups;
 
index d8589afac272f1bc4ae7b6bd9436c8a8b28351d4..c4d60cdbf247bfeecd7d8039448a2f1d92ba2268 100644 (file)
@@ -656,17 +656,12 @@ struct mdev_driver vfio_ccw_mdev_driver = {
        },
        .probe = vfio_ccw_mdev_probe,
        .remove = vfio_ccw_mdev_remove,
-};
-
-static const struct mdev_parent_ops vfio_ccw_mdev_ops = {
-       .owner                  = THIS_MODULE,
-       .device_driver          = &vfio_ccw_mdev_driver,
        .supported_type_groups  = mdev_type_groups,
 };
 
 int vfio_ccw_mdev_reg(struct subchannel *sch)
 {
-       return mdev_register_device(&sch->dev, &vfio_ccw_mdev_ops);
+       return mdev_register_device(&sch->dev, &vfio_ccw_mdev_driver);
 }
 
 void vfio_ccw_mdev_unreg(struct subchannel *sch)
index 6e08d04b605d6e7389c28062b7ab5e0e81c3b97d..ee0a3bf8f476ca2460202a579164d07948ca5082 100644 (file)
@@ -1496,12 +1496,7 @@ static struct mdev_driver vfio_ap_matrix_driver = {
        },
        .probe = vfio_ap_mdev_probe,
        .remove = vfio_ap_mdev_remove,
-};
-
-static const struct mdev_parent_ops vfio_ap_matrix_ops = {
-       .owner                  = THIS_MODULE,
-       .device_driver          = &vfio_ap_matrix_driver,
-       .supported_type_groups  = vfio_ap_mdev_type_groups,
+       .supported_type_groups = vfio_ap_mdev_type_groups,
 };
 
 int vfio_ap_mdev_register(void)
@@ -1514,7 +1509,7 @@ int vfio_ap_mdev_register(void)
        if (ret)
                return ret;
 
-       ret = mdev_register_device(&matrix_dev->device, &vfio_ap_matrix_ops);
+       ret = mdev_register_device(&matrix_dev->device, &vfio_ap_matrix_driver);
        if (ret)
                goto err_driver;
        return 0;
index 8b1e86b9e8bc004b4e1b8d9265c4fd05c69072e1..19a20ff420b7f619937deb8861e2852eaeffe3c4 100644 (file)
@@ -109,12 +109,12 @@ static int mdev_device_remove_cb(struct device *dev, void *data)
 /*
  * mdev_register_device : Register a device
  * @dev: device structure representing parent device.
- * @ops: Parent device operation structure to be registered.
+ * @mdev_driver: Device driver to bind to the newly created mdev
  *
  * Add device to list of registered parent devices.
  * Returns a negative value on error, otherwise 0.
  */
-int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
+int mdev_register_device(struct device *dev, struct mdev_driver *mdev_driver)
 {
        int ret;
        struct mdev_parent *parent;
@@ -122,9 +122,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
        char *envp[] = { env_string, NULL };
 
        /* check for mandatory ops */
-       if (!ops || !ops->supported_type_groups)
-               return -EINVAL;
-       if (!ops->device_driver)
+       if (!mdev_driver->supported_type_groups)
                return -EINVAL;
 
        dev = get_device(dev);
@@ -151,7 +149,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
        init_rwsem(&parent->unreg_sem);
 
        parent->dev = dev;
-       parent->ops = ops;
+       parent->mdev_driver = mdev_driver;
 
        if (!mdev_bus_compat_class) {
                mdev_bus_compat_class = class_compat_register("mdev_bus");
@@ -249,7 +247,7 @@ int mdev_device_create(struct mdev_type *type, const guid_t *uuid)
        int ret;
        struct mdev_device *mdev, *tmp;
        struct mdev_parent *parent = type->parent;
-       struct mdev_driver *drv = parent->ops->device_driver;
+       struct mdev_driver *drv = parent->mdev_driver;
 
        mutex_lock(&mdev_list_lock);
 
@@ -271,7 +269,6 @@ int mdev_device_create(struct mdev_type *type, const guid_t *uuid)
        mdev->dev.parent  = parent->dev;
        mdev->dev.bus = &mdev_bus_type;
        mdev->dev.release = mdev_device_release;
-       mdev->dev.groups = parent->ops->mdev_attr_groups;
        mdev->type = type;
        /* Pairs with the put in mdev_device_release() */
        kobject_get(&type->kobj);
index 6999c89db7b1627a95f33ba652b1659c8a6b84f7..5a7ffd4e770fde5c469223bdc6c62d4220e7d7ee 100644 (file)
@@ -15,7 +15,7 @@ void mdev_bus_unregister(void);
 
 struct mdev_parent {
        struct device *dev;
-       const struct mdev_parent_ops *ops;
+       struct mdev_driver *mdev_driver;
        struct kref ref;
        struct list_head next;
        struct kset *mdev_types_kset;
index 66eef08833a4ef9eba17f703e154c15f78636feb..5a3873d1a275ae142a37798e8ebda4d547d21c58 100644 (file)
@@ -97,7 +97,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
 {
        struct mdev_type *type;
        struct attribute_group *group =
-               parent->ops->supported_type_groups[type_group_id];
+               parent->mdev_driver->supported_type_groups[type_group_id];
        int ret;
 
        if (!group->name) {
@@ -154,7 +154,7 @@ 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];
+               type->parent->mdev_driver->supported_type_groups[type->type_group_id];
 
        sysfs_remove_files(&type->kobj,
                           (const struct attribute **)group->attrs);
@@ -168,7 +168,7 @@ static int add_mdev_supported_type_groups(struct mdev_parent *parent)
 {
        int i;
 
-       for (i = 0; parent->ops->supported_type_groups[i]; i++) {
+       for (i = 0; parent->mdev_driver->supported_type_groups[i]; i++) {
                struct mdev_type *type;
 
                type = add_mdev_supported_type(parent, i);
index 69df1fa2cb6f91ebe79f34fb3cba13257d8e331e..1f6f57a3c3168458c24b510c51e5ddfa36d94f3e 100644 (file)
@@ -30,26 +30,6 @@ unsigned int mdev_get_type_group_id(struct mdev_device *mdev);
 unsigned int mtype_get_type_group_id(struct mdev_type *mtype);
 struct device *mtype_get_parent_dev(struct mdev_type *mtype);
 
-/**
- * struct mdev_parent_ops - Structure to be registered for each parent device to
- * register the device to mdev module.
- *
- * @owner:             The module owner.
- * @device_driver:     Which device driver to probe() on newly created devices
- * @mdev_attr_groups:  Attributes of the mediated device.
- * @supported_type_groups: Attributes to define supported types. It is mandatory
- *                     to provide supported types.
- *
- * Parent device that support mediated device should be registered with mdev
- * module with mdev_parent_ops structure.
- **/
-struct mdev_parent_ops {
-       struct module   *owner;
-       struct mdev_driver *device_driver;
-       const struct attribute_group **mdev_attr_groups;
-       struct attribute_group **supported_type_groups;
-};
-
 /* interface for exporting mdev supported type attributes */
 struct mdev_type_attribute {
        struct attribute attr;
@@ -74,12 +54,15 @@ struct mdev_type_attribute mdev_type_attr_##_name =         \
  * struct mdev_driver - Mediated device driver
  * @probe: called when new device created
  * @remove: called when device removed
+ * @supported_type_groups: Attributes to define supported types. It is mandatory
+ *                     to provide supported types.
  * @driver: device driver structure
  *
  **/
 struct mdev_driver {
        int (*probe)(struct mdev_device *dev);
        void (*remove)(struct mdev_device *dev);
+       struct attribute_group **supported_type_groups;
        struct device_driver driver;
 };
 
@@ -98,7 +81,7 @@ static inline const guid_t *mdev_uuid(struct mdev_device *mdev)
 
 extern struct bus_type mdev_bus_type;
 
-int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops);
+int mdev_register_device(struct device *dev, struct mdev_driver *mdev_driver);
 void mdev_unregister_device(struct device *dev);
 
 int mdev_register_driver(struct mdev_driver *drv);
index e90c8552cc312602cf8d5a994950c17099845742..344c2901a82bf49ab0413a1c9d46bd03b4055b5f 100644 (file)
@@ -1412,12 +1412,7 @@ static struct mdev_driver mbochs_driver = {
        },
        .probe = mbochs_probe,
        .remove = mbochs_remove,
-};
-
-static const struct mdev_parent_ops mdev_fops = {
-       .owner                  = THIS_MODULE,
-       .device_driver          = &mbochs_driver,
-       .supported_type_groups  = mdev_type_groups,
+       .supported_type_groups = mdev_type_groups,
 };
 
 static const struct file_operations vd_fops = {
@@ -1462,7 +1457,7 @@ static int __init mbochs_dev_init(void)
        if (ret)
                goto err_class;
 
-       ret = mdev_register_device(&mbochs_dev, &mdev_fops);
+       ret = mdev_register_device(&mbochs_dev, &mbochs_driver);
        if (ret)
                goto err_device;
 
index fe5d43e797b6d3262c391559f3c37ba2250630c7..e8c46eb2e246858e571b8cc50613c0f2dca46b7b 100644 (file)
@@ -723,12 +723,7 @@ static struct mdev_driver mdpy_driver = {
        },
        .probe = mdpy_probe,
        .remove = mdpy_remove,
-};
-
-static const struct mdev_parent_ops mdev_fops = {
-       .owner                  = THIS_MODULE,
-       .device_driver          = &mdpy_driver,
-       .supported_type_groups  = mdev_type_groups,
+       .supported_type_groups = mdev_type_groups,
 };
 
 static const struct file_operations vd_fops = {
@@ -771,7 +766,7 @@ static int __init mdpy_dev_init(void)
        if (ret)
                goto err_class;
 
-       ret = mdev_register_device(&mdpy_dev, &mdev_fops);
+       ret = mdev_register_device(&mdpy_dev, &mdpy_driver);
        if (ret)
                goto err_device;
 
index 4f227dc26785912910e331eac094fca384524502..f42a59ed2e3fec1609d1383a944e26d579bcfeb4 100644 (file)
@@ -1301,12 +1301,7 @@ static struct mdev_driver mtty_driver = {
        },
        .probe = mtty_probe,
        .remove = mtty_remove,
-};
-
-static const struct mdev_parent_ops mdev_fops = {
-       .owner                  = THIS_MODULE,
-       .device_driver          = &mtty_driver,
-       .supported_type_groups  = mdev_type_groups,
+       .supported_type_groups = mdev_type_groups,
 };
 
 static void mtty_device_release(struct device *dev)
@@ -1357,7 +1352,7 @@ static int __init mtty_dev_init(void)
        if (ret)
                goto err_class;
 
-       ret = mdev_register_device(&mtty_dev.dev, &mdev_fops);
+       ret = mdev_register_device(&mtty_dev.dev, &mtty_driver);
        if (ret)
                goto err_device;
        return 0;