vfio: platform: introduce vfio-platform-base module
authorEric Auger <eric.auger@linaro.org>
Tue, 3 Nov 2015 18:12:12 +0000 (18:12 +0000)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 3 Nov 2015 19:54:56 +0000 (12:54 -0700)
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>
drivers/vfio/platform/Makefile
drivers/vfio/platform/vfio_amba.c
drivers/vfio/platform/vfio_platform.c
drivers/vfio/platform/vfio_platform_common.c
drivers/vfio/platform/vfio_platform_private.h

index 9ce8afe2845041cbd064113bba85309678e37d7a..41a6224f5e6b6ab1b962605ac4e9aede6cac66f7 100644 (file)
@@ -1,10 +1,12 @@
-
-vfio-platform-y := vfio_platform.o vfio_platform_common.o vfio_platform_irq.o
+vfio-platform-base-y := vfio_platform_common.o vfio_platform_irq.o
+vfio-platform-y := vfio_platform.o
 
 obj-$(CONFIG_VFIO_PLATFORM) += vfio-platform.o
+obj-$(CONFIG_VFIO_PLATFORM) += vfio-platform-base.o
 obj-$(CONFIG_VFIO_PLATFORM) += reset/
 
 vfio-amba-y := vfio_amba.o
 
 obj-$(CONFIG_VFIO_AMBA) += vfio-amba.o
+obj-$(CONFIG_VFIO_AMBA) += vfio-platform-base.o
 obj-$(CONFIG_VFIO_AMBA) += reset/
index ff0331f72526b30e2d84a46f7895b97e5478b690..a66479bd0edf968c8209b384264052f79a6ec272 100644 (file)
@@ -67,6 +67,7 @@ static int vfio_amba_probe(struct amba_device *adev, const struct amba_id *id)
        vdev->flags = VFIO_DEVICE_FLAGS_AMBA;
        vdev->get_resource = get_amba_resource;
        vdev->get_irq = get_amba_irq;
+       vdev->parent_module = THIS_MODULE;
 
        ret = vfio_platform_probe_common(vdev, &adev->dev);
        if (ret) {
index cef645c8399679056b130ad19c3dbcbe2e480549..f1625dcfbb23d49d6b0586977a203462df0e75a5 100644 (file)
@@ -65,6 +65,7 @@ static int vfio_platform_probe(struct platform_device *pdev)
        vdev->flags = VFIO_DEVICE_FLAGS_PLATFORM;
        vdev->get_resource = get_platform_resource;
        vdev->get_irq = get_platform_irq;
+       vdev->parent_module = THIS_MODULE;
 
        ret = vfio_platform_probe_common(vdev, &pdev->dev);
        if (ret)
index 8c216de883e31a9849c5ef5dadf2fb30230c5ea0..7f69b852c7e25b025d8d66ec8313673d5ce40105 100644 (file)
 
 #include "vfio_platform_private.h"
 
+#define DRIVER_VERSION  "0.10"
+#define DRIVER_AUTHOR   "Antonios Motakis <a.motakis@virtualopensystems.com>"
+#define DRIVER_DESC     "VFIO platform base module"
+
 static DEFINE_MUTEX(driver_lock);
 
 static const struct vfio_platform_reset_combo reset_lookup_table[] = {
@@ -146,7 +150,7 @@ static void vfio_platform_release(void *device_data)
 
        mutex_unlock(&driver_lock);
 
-       module_put(THIS_MODULE);
+       module_put(vdev->parent_module);
 }
 
 static int vfio_platform_open(void *device_data)
@@ -154,7 +158,7 @@ static int vfio_platform_open(void *device_data)
        struct vfio_platform_device *vdev = device_data;
        int ret;
 
-       if (!try_module_get(THIS_MODULE))
+       if (!try_module_get(vdev->parent_module))
                return -ENODEV;
 
        mutex_lock(&driver_lock);
@@ -573,3 +577,8 @@ struct vfio_platform_device *vfio_platform_remove_common(struct device *dev)
        return vdev;
 }
 EXPORT_SYMBOL_GPL(vfio_platform_remove_common);
+
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
index 1c9b3d59543c1f32e60737be19bb46824bbebda3..71286903fb49f7e3096266dc5ac13f9286410010 100644 (file)
@@ -56,6 +56,7 @@ struct vfio_platform_device {
        u32                             num_irqs;
        int                             refcnt;
        struct mutex                    igate;
+       struct module                   *parent_module;
 
        /*
         * These fields should be filled by the bus specific binder