Commit 71be3423 authored by Alex Williamson's avatar Alex Williamson

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

An unintended consequence of commit 42ac9bd1 ("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: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 66fdc052
...@@ -13,6 +13,11 @@ config VFIO_SPAPR_EEH ...@@ -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
......
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
......
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.
......
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
......
...@@ -1552,11 +1552,6 @@ static int __init vfio_init(void) ...@@ -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) ...@@ -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) ...@@ -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);
......
...@@ -13,12 +13,17 @@ ...@@ -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) ...@@ -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) ...@@ -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);
...@@ -142,8 +142,6 @@ struct virqfd { ...@@ -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 *),
......
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