summaryrefslogtreecommitdiffstats
path: root/drivers/media/media-entity.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-12-09 19:47:35 -0200
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-01-11 12:18:55 -0200
commita08fad1ec80c69c79b3ffb6d84968b0952d32da1 (patch)
tree40b6e812ae1cbb72b83ebc0a3950e3a5add3846a /drivers/media/media-entity.c
parentd47109fa45ee2dc4e0b2710a8225e6c3ac7ea9fd (diff)
downloadlinux-a08fad1ec80c69c79b3ffb6d84968b0952d32da1.tar.bz2
[media] media-entity: protect object creation/removal using spin lock
Some parts of the media controller are using mutexes while others are using spin locks in order to protect creation and removal of elements in the graph. That's wrong! Also, the V4L2 core can remove graph elements on non-interactive context: BUG: sleeping function called from invalid context at include/linux/sched.h:2776 Fix it by always using spin locks for graph element addition/removal, just like entity creation/removal is protected at media-device.c Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/media-entity.c')
-rw-r--r--drivers/media/media-entity.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
index ee0f81364960..b1390d843909 100644
--- a/drivers/media/media-entity.c
+++ b/drivers/media/media-entity.c
@@ -700,9 +700,9 @@ void media_entity_remove_links(struct media_entity *entity)
if (entity->graph_obj.mdev == NULL)
return;
- mutex_lock(&entity->graph_obj.mdev->graph_mutex);
+ spin_lock(&entity->graph_obj.mdev->lock);
__media_entity_remove_links(entity);
- mutex_unlock(&entity->graph_obj.mdev->graph_mutex);
+ spin_unlock(&entity->graph_obj.mdev->lock);
}
EXPORT_SYMBOL_GPL(media_entity_remove_links);
@@ -792,9 +792,9 @@ int media_entity_setup_link(struct media_link *link, u32 flags)
{
int ret;
- mutex_lock(&link->source->entity->graph_obj.mdev->graph_mutex);
+ spin_lock(&link->source->entity->graph_obj.mdev->lock);
ret = __media_entity_setup_link(link, flags);
- mutex_unlock(&link->source->entity->graph_obj.mdev->graph_mutex);
+ spin_unlock(&link->source->entity->graph_obj.mdev->lock);
return ret;
}
@@ -932,9 +932,9 @@ EXPORT_SYMBOL_GPL(__media_remove_intf_link);
void media_remove_intf_link(struct media_link *link)
{
- mutex_lock(&link->graph_obj.mdev->graph_mutex);
+ spin_lock(&link->graph_obj.mdev->lock);
__media_remove_intf_link(link);
- mutex_unlock(&link->graph_obj.mdev->graph_mutex);
+ spin_unlock(&link->graph_obj.mdev->lock);
}
EXPORT_SYMBOL_GPL(media_remove_intf_link);
@@ -954,8 +954,8 @@ void media_remove_intf_links(struct media_interface *intf)
if (intf->graph_obj.mdev == NULL)
return;
- mutex_lock(&intf->graph_obj.mdev->graph_mutex);
+ spin_lock(&intf->graph_obj.mdev->lock);
__media_remove_intf_links(intf);
- mutex_unlock(&intf->graph_obj.mdev->graph_mutex);
+ spin_unlock(&intf->graph_obj.mdev->lock);
}
EXPORT_SYMBOL_GPL(media_remove_intf_links);