From: Kirti Wankhede Date: Sat, 29 Oct 2016 15:12:01 +0530 Subject: [PATCH 1/1] Register mdev_bus class on first mdev_device_register Signed-off-by: Kirti Wankhede Signed-off-by: Neo Jia --- drivers/vfio/mdev/mdev_core.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 9d8fa5c91c2e..54c59f325336 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -187,13 +187,18 @@ int mdev_register_device(struct device *dev, const struct parent_ops *ops) parent->dev = dev; parent->ops = ops; - ret = parent_create_sysfs_files(parent); - if (ret) { - mutex_unlock(&parent_list_lock); - mdev_put_parent(parent); - return ret; + if (!mdev_bus_compat_class) { + mdev_bus_compat_class = class_compat_register("mdev_bus"); + if (!mdev_bus_compat_class) { + ret = -ENOMEM; + goto add_dev_err; + } } + ret = parent_create_sysfs_files(parent); + if (ret) + goto add_dev_err; + ret = class_compat_create_link(mdev_bus_compat_class, dev, NULL); if (ret) dev_warn(dev, "Failed to create compatibility class link\n"); @@ -206,7 +211,10 @@ int mdev_register_device(struct device *dev, const struct parent_ops *ops) add_dev_err: mutex_unlock(&parent_list_lock); - put_device(dev); + if (parent) + mdev_put_parent(parent); + else + put_device(dev); return ret; } EXPORT_SYMBOL(mdev_register_device); @@ -354,12 +362,6 @@ static int __init mdev_init(void) return ret; } - mdev_bus_compat_class = class_compat_register("mdev_bus"); - if (!mdev_bus_compat_class) { - mdev_bus_unregister(); - return -ENOMEM; - } - /* * Attempt to load known vfio_mdev. This gives us a working environment * without the user needing to explicitly load vfio_mdev driver. @@ -371,7 +373,9 @@ static int __init mdev_init(void) static void __exit mdev_exit(void) { - class_compat_unregister(mdev_bus_compat_class); + if (mdev_bus_compat_class) + class_compat_unregister(mdev_bus_compat_class); + mdev_bus_unregister(); } -- 2.7.0