media: v4l2-subdev: handle module refcounting here
The module ownership refcounting was done in media_entity_get/put, but that was very confusing and it did not work either in case an application had a v4l-subdevX device open and the module was unbound. When the v4l-subdevX device was closed the media_entity_put was never called and the module refcount was left one too high, making it impossible to unload it. Since v4l2-subdev.c was the only place where media_entity_get/put was called, just move the functionality to v4l2-subdev.c and drop those confusing entity functions. Store the module in subdev_fh so module_put no longer depends on the media_entity struct. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
0e43734d4c
commit
218bf10e39
@@ -17,7 +17,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <media/media-entity.h>
|
||||
@@ -587,33 +586,6 @@ void media_pipeline_stop(struct media_entity *entity)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_pipeline_stop);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Module use count
|
||||
*/
|
||||
|
||||
struct media_entity *media_entity_get(struct media_entity *entity)
|
||||
{
|
||||
if (entity == NULL)
|
||||
return NULL;
|
||||
|
||||
if (entity->graph_obj.mdev->dev &&
|
||||
!try_module_get(entity->graph_obj.mdev->dev->driver->owner))
|
||||
return NULL;
|
||||
|
||||
return entity;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_get);
|
||||
|
||||
void media_entity_put(struct media_entity *entity)
|
||||
{
|
||||
if (entity == NULL)
|
||||
return;
|
||||
|
||||
if (entity->graph_obj.mdev->dev)
|
||||
module_put(entity->graph_obj.mdev->dev->driver->owner);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_put);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Links management
|
||||
*/
|
||||
|
Reference in New Issue
Block a user