vfio/mdev: Simplify driver registration
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 6 Apr 2021 19:40:27 +0000 (16:40 -0300)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 7 Apr 2021 21:39:16 +0000 (15:39 -0600)
This is only done once, we don't need to generate code to initialize a
structure stored in the ELF .data segment. Fill in the three required
.driver members directly instead of copying data into them during
mdev_register_driver().

Further the to_mdev_driver() function doesn't belong in a public header,
just inline it into the two places that need it. Finally, we can now
clearly see that 'drv' derived from dev->driver cannot be NULL, firstly
because the driver core forbids it, and secondly because NULL won't pass
through the container_of(). Remove the dead code.

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: <4-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Documentation/driver-api/vfio-mediated-device.rst
drivers/vfio/mdev/mdev_driver.c
drivers/vfio/mdev/vfio_mdev.c
include/linux/mdev.h

index c43c1dc..1779b85 100644 (file)
@@ -98,13 +98,11 @@ structure to represent a mediated device's driver::
 
      /*
       * struct mdev_driver [2] - Mediated device's driver
-      * @name: driver name
       * @probe: called when new device created
       * @remove: called when device removed
       * @driver: device driver structure
       */
      struct mdev_driver {
-            const char *name;
             int  (*probe)  (struct mdev_device *dev);
             void (*remove) (struct mdev_device *dev);
             struct device_driver    driver;
@@ -115,8 +113,7 @@ to register and unregister itself with the core driver:
 
 * Register::
 
-    extern int  mdev_register_driver(struct mdev_driver *drv,
-                                  struct module *owner);
+    extern int  mdev_register_driver(struct mdev_driver *drv);
 
 * Unregister::
 
index 44c3ba7..0416995 100644 (file)
@@ -39,7 +39,8 @@ static void mdev_detach_iommu(struct mdev_device *mdev)
 
 static int mdev_probe(struct device *dev)
 {
-       struct mdev_driver *drv = to_mdev_driver(dev->driver);
+       struct mdev_driver *drv =
+               container_of(dev->driver, struct mdev_driver, driver);
        struct mdev_device *mdev = to_mdev_device(dev);
        int ret;
 
@@ -47,7 +48,7 @@ static int mdev_probe(struct device *dev)
        if (ret)
                return ret;
 
-       if (drv && drv->probe) {
+       if (drv->probe) {
                ret = drv->probe(mdev);
                if (ret)
                        mdev_detach_iommu(mdev);
@@ -58,10 +59,11 @@ static int mdev_probe(struct device *dev)
 
 static int mdev_remove(struct device *dev)
 {
-       struct mdev_driver *drv = to_mdev_driver(dev->driver);
+       struct mdev_driver *drv =
+               container_of(dev->driver, struct mdev_driver, driver);
        struct mdev_device *mdev = to_mdev_device(dev);
 
-       if (drv && drv->remove)
+       if (drv->remove)
                drv->remove(mdev);
 
        mdev_detach_iommu(mdev);
@@ -79,16 +81,13 @@ EXPORT_SYMBOL_GPL(mdev_bus_type);
 /**
  * mdev_register_driver - register a new MDEV driver
  * @drv: the driver to register
- * @owner: module owner of driver to be registered
  *
  * Returns a negative value on error, otherwise 0.
  **/
-int mdev_register_driver(struct mdev_driver *drv, struct module *owner)
+int mdev_register_driver(struct mdev_driver *drv)
 {
        /* initialize common driver fields */
-       drv->driver.name = drv->name;
        drv->driver.bus = &mdev_bus_type;
-       drv->driver.owner = owner;
 
        /* register with core */
        return driver_register(&drv->driver);
index 91b7b8b..cc9507e 100644 (file)
@@ -152,14 +152,18 @@ static void vfio_mdev_remove(struct mdev_device *mdev)
 }
 
 static struct mdev_driver vfio_mdev_driver = {
-       .name   = "vfio_mdev",
+       .driver = {
+               .name = "vfio_mdev",
+               .owner = THIS_MODULE,
+               .mod_name = KBUILD_MODNAME,
+       },
        .probe  = vfio_mdev_probe,
        .remove = vfio_mdev_remove,
 };
 
 static int __init vfio_mdev_init(void)
 {
-       return mdev_register_driver(&vfio_mdev_driver, THIS_MODULE);
+       return mdev_register_driver(&vfio_mdev_driver);
 }
 
 static void __exit vfio_mdev_exit(void)
index 52f7ea1..cb771c7 100644 (file)
@@ -137,21 +137,17 @@ struct mdev_type_attribute mdev_type_attr_##_name =               \
 
 /**
  * struct mdev_driver - Mediated device driver
- * @name: driver name
  * @probe: called when new device created
  * @remove: called when device removed
  * @driver: device driver structure
  *
  **/
 struct mdev_driver {
-       const char *name;
        int (*probe)(struct mdev_device *dev);
        void (*remove)(struct mdev_device *dev);
        struct device_driver driver;
 };
 
-#define to_mdev_driver(drv)    container_of(drv, struct mdev_driver, driver)
-
 static inline void *mdev_get_drvdata(struct mdev_device *mdev)
 {
        return mdev->driver_data;
@@ -170,7 +166,7 @@ extern struct bus_type mdev_bus_type;
 int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops);
 void mdev_unregister_device(struct device *dev);
 
-int mdev_register_driver(struct mdev_driver *drv, struct module *owner);
+int mdev_register_driver(struct mdev_driver *drv);
 void mdev_unregister_driver(struct mdev_driver *drv);
 
 struct device *mdev_parent_dev(struct mdev_device *mdev);