Browse Source

vfio: Split virqfd into a separate module for vfio bus drivers

An unintended consequence of commit 42ac9bd18d4f ("vfio: initialize
the virqfd workqueue in VFIO generic code") is that the vfio module
is renamed to vfio_core so that it can include both vfio and virqfd.
That's a user visible change that may break module loading scritps
and it imposes eventfd support as a dependency on the core vfio code,
which it's really not.  virqfd is intended to be provided as a service
to vfio bus drivers, so instead of wrapping it into vfio.ko, we can
make it a stand-alone module toggled by vfio bus drivers.  This has
the additional benefit of removing initialization and exit from the
core vfio code.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Alex Williamson 10 years ago
parent
commit
71be3423a6

+ 5 - 0
drivers/vfio/Kconfig

@@ -13,6 +13,11 @@ config VFIO_SPAPR_EEH
 	depends on EEH && VFIO_IOMMU_SPAPR_TCE
 	depends on EEH && VFIO_IOMMU_SPAPR_TCE
 	default n
 	default n
 
 
+config VFIO_VIRQFD
+	tristate
+	depends on VFIO && EVENTFD
+	default n
+
 menuconfig VFIO
 menuconfig VFIO
 	tristate "VFIO Non-Privileged userspace driver framework"
 	tristate "VFIO Non-Privileged userspace driver framework"
 	depends on IOMMU_API
 	depends on IOMMU_API

+ 3 - 2
drivers/vfio/Makefile

@@ -1,6 +1,7 @@
-vfio_core-y := vfio.o virqfd.o
+vfio_virqfd-y := virqfd.o
 
 
-obj-$(CONFIG_VFIO) += vfio_core.o
+obj-$(CONFIG_VFIO) += vfio.o
+obj-$(CONFIG_VFIO_VIRQFD) += vfio_virqfd.o
 obj-$(CONFIG_VFIO_IOMMU_TYPE1) += vfio_iommu_type1.o
 obj-$(CONFIG_VFIO_IOMMU_TYPE1) += vfio_iommu_type1.o
 obj-$(CONFIG_VFIO_IOMMU_SPAPR_TCE) += vfio_iommu_spapr_tce.o
 obj-$(CONFIG_VFIO_IOMMU_SPAPR_TCE) += vfio_iommu_spapr_tce.o
 obj-$(CONFIG_VFIO_SPAPR_EEH) += vfio_spapr_eeh.o
 obj-$(CONFIG_VFIO_SPAPR_EEH) += vfio_spapr_eeh.o

+ 1 - 0
drivers/vfio/pci/Kconfig

@@ -1,6 +1,7 @@
 config VFIO_PCI
 config VFIO_PCI
 	tristate "VFIO support for PCI devices"
 	tristate "VFIO support for PCI devices"
 	depends on VFIO && PCI && EVENTFD
 	depends on VFIO && PCI && EVENTFD
+	select VFIO_VIRQFD
 	help
 	help
 	  Support for the PCI VFIO bus driver.  This is required to make
 	  Support for the PCI VFIO bus driver.  This is required to make
 	  use of PCI drivers using the VFIO framework.
 	  use of PCI drivers using the VFIO framework.

+ 1 - 0
drivers/vfio/platform/Kconfig

@@ -1,6 +1,7 @@
 config VFIO_PLATFORM
 config VFIO_PLATFORM
 	tristate "VFIO support for platform devices"
 	tristate "VFIO support for platform devices"
 	depends on VFIO && EVENTFD && ARM
 	depends on VFIO && EVENTFD && ARM
+	select VFIO_VIRQFD
 	help
 	help
 	  Support for platform devices with VFIO. This is required to make
 	  Support for platform devices with VFIO. This is required to make
 	  use of platform devices present on the system using the VFIO
 	  use of platform devices present on the system using the VFIO

+ 0 - 8
drivers/vfio/vfio.c

@@ -1552,11 +1552,6 @@ static int __init vfio_init(void)
 	if (ret)
 	if (ret)
 		goto err_cdev_add;
 		goto err_cdev_add;
 
 
-	/* Start the virqfd cleanup handler used by some VFIO bus drivers */
-	ret = vfio_virqfd_init();
-	if (ret)
-		goto err_virqfd;
-
 	pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
 	pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
 
 
 	/*
 	/*
@@ -1569,8 +1564,6 @@ static int __init vfio_init(void)
 
 
 	return 0;
 	return 0;
 
 
-err_virqfd:
-	cdev_del(&vfio.group_cdev);
 err_cdev_add:
 err_cdev_add:
 	unregister_chrdev_region(vfio.group_devt, MINORMASK);
 	unregister_chrdev_region(vfio.group_devt, MINORMASK);
 err_alloc_chrdev:
 err_alloc_chrdev:
@@ -1585,7 +1578,6 @@ static void __exit vfio_cleanup(void)
 {
 {
 	WARN_ON(!list_empty(&vfio.group_list));
 	WARN_ON(!list_empty(&vfio.group_list));
 
 
-	vfio_virqfd_exit();
 	idr_destroy(&vfio.group_idr);
 	idr_destroy(&vfio.group_idr);
 	cdev_del(&vfio.group_cdev);
 	cdev_del(&vfio.group_cdev);
 	unregister_chrdev_region(vfio.group_devt, MINORMASK);
 	unregister_chrdev_region(vfio.group_devt, MINORMASK);

+ 15 - 2
drivers/vfio/virqfd.c

@@ -13,12 +13,17 @@
 #include <linux/vfio.h>
 #include <linux/vfio.h>
 #include <linux/eventfd.h>
 #include <linux/eventfd.h>
 #include <linux/file.h>
 #include <linux/file.h>
+#include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 
 
+#define DRIVER_VERSION  "0.1"
+#define DRIVER_AUTHOR   "Alex Williamson <alex.williamson@redhat.com>"
+#define DRIVER_DESC     "IRQFD support for VFIO bus drivers"
+
 static struct workqueue_struct *vfio_irqfd_cleanup_wq;
 static struct workqueue_struct *vfio_irqfd_cleanup_wq;
 static DEFINE_SPINLOCK(virqfd_lock);
 static DEFINE_SPINLOCK(virqfd_lock);
 
 
-int __init vfio_virqfd_init(void)
+static int __init vfio_virqfd_init(void)
 {
 {
 	vfio_irqfd_cleanup_wq =
 	vfio_irqfd_cleanup_wq =
 		create_singlethread_workqueue("vfio-irqfd-cleanup");
 		create_singlethread_workqueue("vfio-irqfd-cleanup");
@@ -28,7 +33,7 @@ int __init vfio_virqfd_init(void)
 	return 0;
 	return 0;
 }
 }
 
 
-void vfio_virqfd_exit(void)
+static void __exit vfio_virqfd_exit(void)
 {
 {
 	destroy_workqueue(vfio_irqfd_cleanup_wq);
 	destroy_workqueue(vfio_irqfd_cleanup_wq);
 }
 }
@@ -211,3 +216,11 @@ void vfio_virqfd_disable(struct virqfd **pvirqfd)
 	flush_workqueue(vfio_irqfd_cleanup_wq);
 	flush_workqueue(vfio_irqfd_cleanup_wq);
 }
 }
 EXPORT_SYMBOL_GPL(vfio_virqfd_disable);
 EXPORT_SYMBOL_GPL(vfio_virqfd_disable);
+
+module_init(vfio_virqfd_init);
+module_exit(vfio_virqfd_exit);
+
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);

+ 0 - 2
include/linux/vfio.h

@@ -142,8 +142,6 @@ struct virqfd {
 	struct virqfd		**pvirqfd;
 	struct virqfd		**pvirqfd;
 };
 };
 
 
-extern int vfio_virqfd_init(void);
-extern void vfio_virqfd_exit(void);
 extern int vfio_virqfd_enable(void *opaque,
 extern int vfio_virqfd_enable(void *opaque,
 			      int (*handler)(void *, void *),
 			      int (*handler)(void *, void *),
 			      void (*thread)(void *, void *),
 			      void (*thread)(void *, void *),