vfio/mdev: Simplify driver registration
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>
This commit is contained in:
parent
2a3d15f270
commit
91b9969d9c
4 changed files with 15 additions and 19 deletions
|
@ -98,13 +98,11 @@ structure to represent a mediated device's driver::
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* struct mdev_driver [2] - Mediated device's driver
|
* struct mdev_driver [2] - Mediated device's driver
|
||||||
* @name: driver name
|
|
||||||
* @probe: called when new device created
|
* @probe: called when new device created
|
||||||
* @remove: called when device removed
|
* @remove: called when device removed
|
||||||
* @driver: device driver structure
|
* @driver: device driver structure
|
||||||
*/
|
*/
|
||||||
struct mdev_driver {
|
struct mdev_driver {
|
||||||
const char *name;
|
|
||||||
int (*probe) (struct mdev_device *dev);
|
int (*probe) (struct mdev_device *dev);
|
||||||
void (*remove) (struct mdev_device *dev);
|
void (*remove) (struct mdev_device *dev);
|
||||||
struct device_driver driver;
|
struct device_driver driver;
|
||||||
|
@ -115,8 +113,7 @@ to register and unregister itself with the core driver:
|
||||||
|
|
||||||
* Register::
|
* Register::
|
||||||
|
|
||||||
extern int mdev_register_driver(struct mdev_driver *drv,
|
extern int mdev_register_driver(struct mdev_driver *drv);
|
||||||
struct module *owner);
|
|
||||||
|
|
||||||
* Unregister::
|
* Unregister::
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,8 @@ static void mdev_detach_iommu(struct mdev_device *mdev)
|
||||||
|
|
||||||
static int mdev_probe(struct device *dev)
|
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);
|
struct mdev_device *mdev = to_mdev_device(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ static int mdev_probe(struct device *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (drv && drv->probe) {
|
if (drv->probe) {
|
||||||
ret = drv->probe(mdev);
|
ret = drv->probe(mdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
mdev_detach_iommu(mdev);
|
mdev_detach_iommu(mdev);
|
||||||
|
@ -58,10 +59,11 @@ static int mdev_probe(struct device *dev)
|
||||||
|
|
||||||
static int mdev_remove(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);
|
struct mdev_device *mdev = to_mdev_device(dev);
|
||||||
|
|
||||||
if (drv && drv->remove)
|
if (drv->remove)
|
||||||
drv->remove(mdev);
|
drv->remove(mdev);
|
||||||
|
|
||||||
mdev_detach_iommu(mdev);
|
mdev_detach_iommu(mdev);
|
||||||
|
@ -79,16 +81,13 @@ EXPORT_SYMBOL_GPL(mdev_bus_type);
|
||||||
/**
|
/**
|
||||||
* mdev_register_driver - register a new MDEV driver
|
* mdev_register_driver - register a new MDEV driver
|
||||||
* @drv: the driver to register
|
* @drv: the driver to register
|
||||||
* @owner: module owner of driver to be registered
|
|
||||||
*
|
*
|
||||||
* Returns a negative value on error, otherwise 0.
|
* 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 */
|
/* initialize common driver fields */
|
||||||
drv->driver.name = drv->name;
|
|
||||||
drv->driver.bus = &mdev_bus_type;
|
drv->driver.bus = &mdev_bus_type;
|
||||||
drv->driver.owner = owner;
|
|
||||||
|
|
||||||
/* register with core */
|
/* register with core */
|
||||||
return driver_register(&drv->driver);
|
return driver_register(&drv->driver);
|
||||||
|
|
|
@ -152,14 +152,18 @@ static void vfio_mdev_remove(struct mdev_device *mdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct mdev_driver vfio_mdev_driver = {
|
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,
|
.probe = vfio_mdev_probe,
|
||||||
.remove = vfio_mdev_remove,
|
.remove = vfio_mdev_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init vfio_mdev_init(void)
|
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)
|
static void __exit vfio_mdev_exit(void)
|
||||||
|
|
|
@ -137,21 +137,17 @@ struct mdev_type_attribute mdev_type_attr_##_name = \
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct mdev_driver - Mediated device driver
|
* struct mdev_driver - Mediated device driver
|
||||||
* @name: driver name
|
|
||||||
* @probe: called when new device created
|
* @probe: called when new device created
|
||||||
* @remove: called when device removed
|
* @remove: called when device removed
|
||||||
* @driver: device driver structure
|
* @driver: device driver structure
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
struct mdev_driver {
|
struct mdev_driver {
|
||||||
const char *name;
|
|
||||||
int (*probe)(struct mdev_device *dev);
|
int (*probe)(struct mdev_device *dev);
|
||||||
void (*remove)(struct mdev_device *dev);
|
void (*remove)(struct mdev_device *dev);
|
||||||
struct device_driver driver;
|
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)
|
static inline void *mdev_get_drvdata(struct mdev_device *mdev)
|
||||||
{
|
{
|
||||||
return mdev->driver_data;
|
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);
|
int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops);
|
||||||
void mdev_unregister_device(struct device *dev);
|
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);
|
void mdev_unregister_driver(struct mdev_driver *drv);
|
||||||
|
|
||||||
struct device *mdev_parent_dev(struct mdev_device *mdev);
|
struct device *mdev_parent_dev(struct mdev_device *mdev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue