summaryrefslogtreecommitdiffstats
path: root/drivers/vfio
diff options
context:
space:
mode:
authorYi Liu <yi.l.liu@intel.com>2022-09-23 16:08:36 +0200
committerJason Gunthorpe <jgg@nvidia.com>2022-12-05 13:56:01 +0100
commit1334e47ee798ac4715330a6ade0afc929cd54aff (patch)
treec3a44aaa4e8943acd23cb53c6cb89875d09ddbf9 /drivers/vfio
parentvfio: Refactor vfio_device open and close (diff)
downloadlinux-1334e47ee798ac4715330a6ade0afc929cd54aff.tar.xz
linux-1334e47ee798ac4715330a6ade0afc929cd54aff.zip
vfio: Wrap vfio group module init/clean code into helpers
This wraps the init/clean code of vfio group global variable to be helpers, and prepares for further moving vfio group specific code into separate file. As container is used by group, so vfio_container_init/cleanup() is moved into vfio_group_init/cleanup(). Link: https://lore.kernel.org/r/20221201145535.589687-9-yi.l.liu@intel.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Alex Williamson <alex.williamson@redhat.com> Tested-by: Lixiao Yang <lixiao.yang@intel.com> Tested-by: Yu He <yu.he@intel.com> Signed-off-by: Yi Liu <yi.l.liu@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/vfio')
-rw-r--r--drivers/vfio/vfio_main.c56
1 files changed, 36 insertions, 20 deletions
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index a4583f4827e5..e053998baffd 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -2066,12 +2066,11 @@ static char *vfio_devnode(struct device *dev, umode_t *mode)
return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev));
}
-static int __init vfio_init(void)
+static int __init vfio_group_init(void)
{
int ret;
ida_init(&vfio.group_ida);
- ida_init(&vfio.device_ida);
mutex_init(&vfio.group_lock);
INIT_LIST_HEAD(&vfio.group_list);
@@ -2088,24 +2087,12 @@ static int __init vfio_init(void)
vfio.class->devnode = vfio_devnode;
- /* /sys/class/vfio-dev/vfioX */
- vfio.device_class = class_create(THIS_MODULE, "vfio-dev");
- if (IS_ERR(vfio.device_class)) {
- ret = PTR_ERR(vfio.device_class);
- goto err_dev_class;
- }
-
ret = alloc_chrdev_region(&vfio.group_devt, 0, MINORMASK + 1, "vfio");
if (ret)
goto err_alloc_chrdev;
-
- pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
return 0;
err_alloc_chrdev:
- class_destroy(vfio.device_class);
- vfio.device_class = NULL;
-err_dev_class:
class_destroy(vfio.class);
vfio.class = NULL;
err_group_class:
@@ -2113,18 +2100,47 @@ err_group_class:
return ret;
}
-static void __exit vfio_cleanup(void)
+static void vfio_group_cleanup(void)
{
WARN_ON(!list_empty(&vfio.group_list));
-
- ida_destroy(&vfio.device_ida);
ida_destroy(&vfio.group_ida);
unregister_chrdev_region(vfio.group_devt, MINORMASK + 1);
- class_destroy(vfio.device_class);
- vfio.device_class = NULL;
class_destroy(vfio.class);
- vfio_container_cleanup();
vfio.class = NULL;
+ vfio_container_cleanup();
+}
+
+static int __init vfio_init(void)
+{
+ int ret;
+
+ ida_init(&vfio.device_ida);
+
+ ret = vfio_group_init();
+ if (ret)
+ return ret;
+
+ /* /sys/class/vfio-dev/vfioX */
+ vfio.device_class = class_create(THIS_MODULE, "vfio-dev");
+ if (IS_ERR(vfio.device_class)) {
+ ret = PTR_ERR(vfio.device_class);
+ goto err_dev_class;
+ }
+
+ pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
+ return 0;
+
+err_dev_class:
+ vfio_group_cleanup();
+ return ret;
+}
+
+static void __exit vfio_cleanup(void)
+{
+ ida_destroy(&vfio.device_ida);
+ class_destroy(vfio.device_class);
+ vfio.device_class = NULL;
+ vfio_group_cleanup();
xa_destroy(&vfio_device_set_xa);
}