Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vfio: platform: introduce vfio-platform-base module

To prepare for vfio platform reset rework let's build
vfio_platform_common.c and vfio_platform_irq.c in a separate
module from vfio-platform and vfio-amba. This makes possible
to have separate module inits and works around a race between
platform driver init and vfio reset module init: that way we
make sure symbols exported by base are available when vfio-platform
driver gets probed.

The open/release being implemented in the base module, the ref
count is applied to the parent module instead.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>

authored by

Eric Auger and committed by
Alex Williamson
32a2d71c 1b4bb2ea

+18 -4
+4 -2
drivers/vfio/platform/Makefile
··· 1 - 2 - vfio-platform-y := vfio_platform.o vfio_platform_common.o vfio_platform_irq.o 1 + vfio-platform-base-y := vfio_platform_common.o vfio_platform_irq.o 2 + vfio-platform-y := vfio_platform.o 3 3 4 4 obj-$(CONFIG_VFIO_PLATFORM) += vfio-platform.o 5 + obj-$(CONFIG_VFIO_PLATFORM) += vfio-platform-base.o 5 6 obj-$(CONFIG_VFIO_PLATFORM) += reset/ 6 7 7 8 vfio-amba-y := vfio_amba.o 8 9 9 10 obj-$(CONFIG_VFIO_AMBA) += vfio-amba.o 11 + obj-$(CONFIG_VFIO_AMBA) += vfio-platform-base.o 10 12 obj-$(CONFIG_VFIO_AMBA) += reset/
+1
drivers/vfio/platform/vfio_amba.c
··· 67 67 vdev->flags = VFIO_DEVICE_FLAGS_AMBA; 68 68 vdev->get_resource = get_amba_resource; 69 69 vdev->get_irq = get_amba_irq; 70 + vdev->parent_module = THIS_MODULE; 70 71 71 72 ret = vfio_platform_probe_common(vdev, &adev->dev); 72 73 if (ret) {
+1
drivers/vfio/platform/vfio_platform.c
··· 65 65 vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM; 66 66 vdev->get_resource = get_platform_resource; 67 67 vdev->get_irq = get_platform_irq; 68 + vdev->parent_module = THIS_MODULE; 68 69 69 70 ret = vfio_platform_probe_common(vdev, &pdev->dev); 70 71 if (ret)
+11 -2
drivers/vfio/platform/vfio_platform_common.c
··· 23 23 24 24 #include "vfio_platform_private.h" 25 25 26 + #define DRIVER_VERSION "0.10" 27 + #define DRIVER_AUTHOR "Antonios Motakis <a.motakis@virtualopensystems.com>" 28 + #define DRIVER_DESC "VFIO platform base module" 29 + 26 30 static DEFINE_MUTEX(driver_lock); 27 31 28 32 static const struct vfio_platform_reset_combo reset_lookup_table[] = { ··· 150 146 151 147 mutex_unlock(&driver_lock); 152 148 153 - module_put(THIS_MODULE); 149 + module_put(vdev->parent_module); 154 150 } 155 151 156 152 static int vfio_platform_open(void *device_data) ··· 158 154 struct vfio_platform_device *vdev = device_data; 159 155 int ret; 160 156 161 - if (!try_module_get(THIS_MODULE)) 157 + if (!try_module_get(vdev->parent_module)) 162 158 return -ENODEV; 163 159 164 160 mutex_lock(&driver_lock); ··· 577 573 return vdev; 578 574 } 579 575 EXPORT_SYMBOL_GPL(vfio_platform_remove_common); 576 + 577 + MODULE_VERSION(DRIVER_VERSION); 578 + MODULE_LICENSE("GPL v2"); 579 + MODULE_AUTHOR(DRIVER_AUTHOR); 580 + MODULE_DESCRIPTION(DRIVER_DESC);
+1
drivers/vfio/platform/vfio_platform_private.h
··· 56 56 u32 num_irqs; 57 57 int refcnt; 58 58 struct mutex igate; 59 + struct module *parent_module; 59 60 60 61 /* 61 62 * These fields should be filled by the bus specific binder