mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
vfio/mdev: Add missing typesafety around mdev_device
The mdev API should accept and pass a 'struct mdev_device *' in all places, not pass a 'struct device *' and cast it internally with to_mdev_device(). Particularly in its struct mdev_driver functions, the whole point of a bus's struct device_driver wrapper is to provide type safety compared to the default struct device_driver. Further, the driver core standard is for bus drivers to expose their device structure in their public headers that can be used with container_of() inlines and '&foo->dev' to go between the class levels, and '&foo->dev' to be used with dev_err/etc driver core helper functions. Move 'struct mdev_device' to mdev.h Once done this allows moving some one instruction exported functions to static inlines, which in turns allows removing one of the two grotesque symbol_get()'s related to mdev in the core code. Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Message-Id: <3-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
b5a1f8921d
commit
2a3d15f270
8 changed files with 83 additions and 128 deletions
|
@ -10,7 +10,21 @@
|
|||
#ifndef MDEV_H
|
||||
#define MDEV_H
|
||||
|
||||
struct mdev_device;
|
||||
struct mdev_device {
|
||||
struct device dev;
|
||||
struct mdev_parent *parent;
|
||||
guid_t uuid;
|
||||
void *driver_data;
|
||||
struct list_head next;
|
||||
struct kobject *type_kobj;
|
||||
struct device *iommu_device;
|
||||
bool active;
|
||||
};
|
||||
|
||||
static inline struct mdev_device *to_mdev_device(struct device *dev)
|
||||
{
|
||||
return container_of(dev, struct mdev_device, dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by the parent device driver to set the device which represents
|
||||
|
@ -19,12 +33,17 @@ struct mdev_device;
|
|||
*
|
||||
* @dev: the mediated device that iommu will isolate.
|
||||
* @iommu_device: a pci device which represents the iommu for @dev.
|
||||
*
|
||||
* Return 0 for success, otherwise negative error value.
|
||||
*/
|
||||
int mdev_set_iommu_device(struct device *dev, struct device *iommu_device);
|
||||
static inline void mdev_set_iommu_device(struct mdev_device *mdev,
|
||||
struct device *iommu_device)
|
||||
{
|
||||
mdev->iommu_device = iommu_device;
|
||||
}
|
||||
|
||||
struct device *mdev_get_iommu_device(struct device *dev);
|
||||
static inline struct device *mdev_get_iommu_device(struct mdev_device *mdev)
|
||||
{
|
||||
return mdev->iommu_device;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct mdev_parent_ops - Structure to be registered for each parent device to
|
||||
|
@ -126,16 +145,25 @@ struct mdev_type_attribute mdev_type_attr_##_name = \
|
|||
**/
|
||||
struct mdev_driver {
|
||||
const char *name;
|
||||
int (*probe)(struct device *dev);
|
||||
void (*remove)(struct device *dev);
|
||||
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)
|
||||
|
||||
void *mdev_get_drvdata(struct mdev_device *mdev);
|
||||
void mdev_set_drvdata(struct mdev_device *mdev, void *data);
|
||||
const guid_t *mdev_uuid(struct mdev_device *mdev);
|
||||
static inline void *mdev_get_drvdata(struct mdev_device *mdev)
|
||||
{
|
||||
return mdev->driver_data;
|
||||
}
|
||||
static inline void mdev_set_drvdata(struct mdev_device *mdev, void *data)
|
||||
{
|
||||
mdev->driver_data = data;
|
||||
}
|
||||
static inline const guid_t *mdev_uuid(struct mdev_device *mdev)
|
||||
{
|
||||
return &mdev->uuid;
|
||||
}
|
||||
|
||||
extern struct bus_type mdev_bus_type;
|
||||
|
||||
|
@ -146,7 +174,13 @@ int mdev_register_driver(struct mdev_driver *drv, struct module *owner);
|
|||
void mdev_unregister_driver(struct mdev_driver *drv);
|
||||
|
||||
struct device *mdev_parent_dev(struct mdev_device *mdev);
|
||||
struct device *mdev_dev(struct mdev_device *mdev);
|
||||
struct mdev_device *mdev_from_dev(struct device *dev);
|
||||
static inline struct device *mdev_dev(struct mdev_device *mdev)
|
||||
{
|
||||
return &mdev->dev;
|
||||
}
|
||||
static inline struct mdev_device *mdev_from_dev(struct device *dev)
|
||||
{
|
||||
return dev->bus == &mdev_bus_type ? to_mdev_device(dev) : NULL;
|
||||
}
|
||||
|
||||
#endif /* MDEV_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue