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>
This commit is contained in:
parent
66fdc052d7
commit
71be3423a6
@ -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
|
||||||
|
@ -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,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,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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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 *),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user