Commit 15fcc44b authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Alex Williamson

vfio/mdev: Add mdev/mtype_get_type_group_id()

This returns the index in the supported_type_groups array that is
associated with the mdev_type attached to the struct mdev_device or its
containing struct kobject.

Each mdev_device can be spawned from exactly one mdev_type, which in turn
originates from exactly one supported_type_group.

Drivers are using weird string calculations to try and get back to this
index, providing a direct access to the index removes a bunch of wonky
driver code.

mdev_type->group can be deleted as the group is obtained using the
type_group_id.
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Message-Id: <11-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com>
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent fbea4323
...@@ -33,6 +33,26 @@ struct device *mdev_parent_dev(struct mdev_device *mdev) ...@@ -33,6 +33,26 @@ struct device *mdev_parent_dev(struct mdev_device *mdev)
} }
EXPORT_SYMBOL(mdev_parent_dev); 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 kobject *mtype_kobj)
{
return container_of(mtype_kobj, struct mdev_type, kobj)->type_group_id;
}
EXPORT_SYMBOL(mtype_get_type_group_id);
/* Should be called holding parent_list_lock */ /* Should be called holding parent_list_lock */
static struct mdev_parent *__find_parent_device(struct device *dev) static struct mdev_parent *__find_parent_device(struct device *dev)
{ {
......
...@@ -29,7 +29,7 @@ struct mdev_type { ...@@ -29,7 +29,7 @@ struct mdev_type {
struct kobject *devices_kobj; struct kobject *devices_kobj;
struct mdev_parent *parent; struct mdev_parent *parent;
struct list_head next; struct list_head next;
struct attribute_group *group; unsigned int type_group_id;
}; };
#define to_mdev_type_attr(_attr) \ #define to_mdev_type_attr(_attr) \
......
...@@ -92,9 +92,11 @@ static struct kobj_type mdev_type_ktype = { ...@@ -92,9 +92,11 @@ static struct kobj_type mdev_type_ktype = {
}; };
static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
struct attribute_group *group) unsigned int type_group_id)
{ {
struct mdev_type *type; struct mdev_type *type;
struct attribute_group *group =
parent->ops->supported_type_groups[type_group_id];
int ret; int ret;
if (!group->name) { if (!group->name) {
...@@ -110,6 +112,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, ...@@ -110,6 +112,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
type->parent = parent; type->parent = parent;
/* Pairs with the put in mdev_type_release() */ /* Pairs with the put in mdev_type_release() */
mdev_get_parent(parent); mdev_get_parent(parent);
type->type_group_id = type_group_id;
ret = kobject_init_and_add(&type->kobj, &mdev_type_ktype, NULL, ret = kobject_init_and_add(&type->kobj, &mdev_type_ktype, NULL,
"%s-%s", dev_driver_string(parent->dev), "%s-%s", dev_driver_string(parent->dev),
...@@ -135,8 +138,6 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, ...@@ -135,8 +138,6 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
ret = -ENOMEM; ret = -ENOMEM;
goto attrs_failed; goto attrs_failed;
} }
type->group = group;
return type; return type;
attrs_failed: attrs_failed:
...@@ -151,8 +152,11 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, ...@@ -151,8 +152,11 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
static void remove_mdev_supported_type(struct mdev_type *type) static void remove_mdev_supported_type(struct mdev_type *type)
{ {
struct attribute_group *group =
type->parent->ops->supported_type_groups[type->type_group_id];
sysfs_remove_files(&type->kobj, sysfs_remove_files(&type->kobj,
(const struct attribute **)type->group->attrs); (const struct attribute **)group->attrs);
kobject_put(type->devices_kobj); kobject_put(type->devices_kobj);
sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr); sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr);
kobject_del(&type->kobj); kobject_del(&type->kobj);
...@@ -166,8 +170,7 @@ static int add_mdev_supported_type_groups(struct mdev_parent *parent) ...@@ -166,8 +170,7 @@ static int add_mdev_supported_type_groups(struct mdev_parent *parent)
for (i = 0; parent->ops->supported_type_groups[i]; i++) { for (i = 0; parent->ops->supported_type_groups[i]; i++) {
struct mdev_type *type; struct mdev_type *type;
type = add_mdev_supported_type(parent, type = add_mdev_supported_type(parent, i);
parent->ops->supported_type_groups[i]);
if (IS_ERR(type)) { if (IS_ERR(type)) {
struct mdev_type *ltype, *tmp; struct mdev_type *ltype, *tmp;
......
...@@ -46,6 +46,9 @@ static inline struct device *mdev_get_iommu_device(struct mdev_device *mdev) ...@@ -46,6 +46,9 @@ static inline struct device *mdev_get_iommu_device(struct mdev_device *mdev)
return mdev->iommu_device; return mdev->iommu_device;
} }
unsigned int mdev_get_type_group_id(struct mdev_device *mdev);
unsigned int mtype_get_type_group_id(struct kobject *mtype_kobj);
/** /**
* struct mdev_parent_ops - Structure to be registered for each parent device to * struct mdev_parent_ops - Structure to be registered for each parent device to
* register the device to mdev module. * register the device to mdev module.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment