This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/media_tree.git tree:

Subject: [media] v4l: Only get module if it's different than the driver for 
v4l2_dev
Author:  Sakari Ailus <[email protected]>
Date:    Thu Dec 12 09:36:46 2013 -0300

When the sub-device is registered, increment the use count of the sub-device
owner only if it's different from the owner of the driver for the media
device. This avoids increasing the use count by the module itself and thus
making it possible to unload it when it's not in use.

Signed-off-by: Sakari Ailus <[email protected]>
Acked-by: Laurent Pinchart <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 drivers/media/v4l2-core/v4l2-device.c |   18 +++++++++++++++---
 include/media/v4l2-subdev.h           |    1 +
 2 files changed, 16 insertions(+), 3 deletions(-)

---

http://git.linuxtv.org/media_tree.git?a=commitdiff;h=b2a06aecb24329e16edc3108b8192d65ace8da75

diff --git a/drivers/media/v4l2-core/v4l2-device.c 
b/drivers/media/v4l2-core/v4l2-device.c
index 02d1b63..015f92a 100644
--- a/drivers/media/v4l2-core/v4l2-device.c
+++ b/drivers/media/v4l2-core/v4l2-device.c
@@ -158,7 +158,17 @@ int v4l2_device_register_subdev(struct v4l2_device 
*v4l2_dev,
        /* Warn if we apparently re-register a subdev */
        WARN_ON(sd->v4l2_dev != NULL);
 
-       if (!try_module_get(sd->owner))
+       /*
+        * The reason to acquire the module here is to avoid unloading
+        * a module of sub-device which is registered to a media
+        * device. To make it possible to unload modules for media
+        * devices that also register sub-devices, do not
+        * try_module_get() such sub-device owners.
+        */
+       sd->owner_v4l2_dev = v4l2_dev->dev && v4l2_dev->dev->driver &&
+               sd->owner == v4l2_dev->dev->driver->owner;
+
+       if (!sd->owner_v4l2_dev && !try_module_get(sd->owner))
                return -ENODEV;
 
        sd->v4l2_dev = v4l2_dev;
@@ -192,7 +202,8 @@ error_unregister:
        if (sd->internal_ops && sd->internal_ops->unregistered)
                sd->internal_ops->unregistered(sd);
 error_module:
-       module_put(sd->owner);
+       if (!sd->owner_v4l2_dev)
+               module_put(sd->owner);
        sd->v4l2_dev = NULL;
        return err;
 }
@@ -280,6 +291,7 @@ void v4l2_device_unregister_subdev(struct v4l2_subdev *sd)
        }
 #endif
        video_unregister_device(sd->devnode);
-       module_put(sd->owner);
+       if (!sd->owner_v4l2_dev)
+               module_put(sd->owner);
 }
 EXPORT_SYMBOL_GPL(v4l2_device_unregister_subdev);
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index ee1cb2d..ee0ae76 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -584,6 +584,7 @@ struct v4l2_subdev {
 #endif
        struct list_head list;
        struct module *owner;
+       bool owner_v4l2_dev;
        u32 flags;
        struct v4l2_device *v4l2_dev;
        const struct v4l2_subdev_ops *ops;

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to