vfio/mdev: simplify mdev_type handling
Instead of abusing struct attribute_group to control initialization of struct mdev_type, just define the actual attributes in the mdev_driver, allocate the mdev_type structures in the caller and pass them to mdev_register_parent. This allows the caller to use container_of to get at the containing structure and thus significantly simplify the code. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Tony Krowiak <akrowiak@linux.ibm.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com> Reviewed-by: Eric Farman <farman@linux.ibm.com> Link: https://lore.kernel.org/r/20220923092652.100656-6-hch@lst.de Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
89345d5177
commit
da44c340c4
17 changed files with 165 additions and 326 deletions
|
|
@ -29,26 +29,6 @@ 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 mdev_type *mtype)
|
||||
{
|
||||
return mtype->type_group_id;
|
||||
}
|
||||
EXPORT_SYMBOL(mtype_get_type_group_id);
|
||||
|
||||
/*
|
||||
* Used in mdev_type_attribute sysfs functions to return the parent struct
|
||||
* device
|
||||
|
|
@ -85,6 +65,8 @@ static int mdev_device_remove_cb(struct device *dev, void *data)
|
|||
* @parent: parent structure registered
|
||||
* @dev: device structure representing parent device.
|
||||
* @mdev_driver: Device driver to bind to the newly created mdev
|
||||
* @types: Array of supported mdev types
|
||||
* @nr_types: Number of entries in @types
|
||||
*
|
||||
* Registers the @parent stucture as a parent for mdev types and thus mdev
|
||||
* devices. The caller needs to hold a reference on @dev that must not be
|
||||
|
|
@ -93,20 +75,19 @@ static int mdev_device_remove_cb(struct device *dev, void *data)
|
|||
* Returns a negative value on error, otherwise 0.
|
||||
*/
|
||||
int mdev_register_parent(struct mdev_parent *parent, struct device *dev,
|
||||
struct mdev_driver *mdev_driver)
|
||||
struct mdev_driver *mdev_driver, struct mdev_type **types,
|
||||
unsigned int nr_types)
|
||||
{
|
||||
char *env_string = "MDEV_STATE=registered";
|
||||
char *envp[] = { env_string, NULL };
|
||||
int ret;
|
||||
|
||||
/* check for mandatory ops */
|
||||
if (!mdev_driver->supported_type_groups)
|
||||
return -EINVAL;
|
||||
|
||||
memset(parent, 0, sizeof(*parent));
|
||||
init_rwsem(&parent->unreg_sem);
|
||||
parent->dev = dev;
|
||||
parent->mdev_driver = mdev_driver;
|
||||
parent->types = types;
|
||||
parent->nr_types = nr_types;
|
||||
|
||||
if (!mdev_bus_compat_class) {
|
||||
mdev_bus_compat_class = class_compat_register("mdev_bus");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue