diff options
Diffstat (limited to 'patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch')
-rw-r--r-- | patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch b/patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch new file mode 100644 index 00000000000000..8c2357a71af6c1 --- /dev/null +++ b/patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch @@ -0,0 +1,105 @@ +From 7d00fef15d5b02f05a6a3d77b8c3eb35a747194f Mon Sep 17 00:00:00 2001 +From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> +Date: Mon, 13 Apr 2015 11:43:40 -0300 +Subject: [PATCH 266/326] [media] v4l: vsp1: Don't sleep in atomic context + +The vsp1_entity_is_streaming() function is called in atomic context when +queuing buffers, and sleeps due to a mutex. As the mutex just protects +access to one structure field, fix this by replace the mutex with a +spinlock. + +Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> +Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> +(cherry picked from commit adb8963f27e00273c912a53f28f7af5d14cfd32e) +Signed-off-by: Simon Horman <horms+renesas@verge.net.au> +--- + drivers/media/platform/vsp1/vsp1_entity.c | 18 +++++++++--------- + drivers/media/platform/vsp1/vsp1_entity.h | 4 ++-- + 2 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/drivers/media/platform/vsp1/vsp1_entity.c b/drivers/media/platform/vsp1/vsp1_entity.c +index a453bb4ddd37..fd95a75b04f4 100644 +--- a/drivers/media/platform/vsp1/vsp1_entity.c ++++ b/drivers/media/platform/vsp1/vsp1_entity.c +@@ -24,22 +24,24 @@ + + bool vsp1_entity_is_streaming(struct vsp1_entity *entity) + { ++ unsigned long flags; + bool streaming; + +- mutex_lock(&entity->lock); ++ spin_lock_irqsave(&entity->lock, flags); + streaming = entity->streaming; +- mutex_unlock(&entity->lock); ++ spin_unlock_irqrestore(&entity->lock, flags); + + return streaming; + } + + int vsp1_entity_set_streaming(struct vsp1_entity *entity, bool streaming) + { ++ unsigned long flags; + int ret; + +- mutex_lock(&entity->lock); ++ spin_lock_irqsave(&entity->lock, flags); + entity->streaming = streaming; +- mutex_unlock(&entity->lock); ++ spin_unlock_irqrestore(&entity->lock, flags); + + if (!streaming) + return 0; +@@ -49,9 +51,9 @@ int vsp1_entity_set_streaming(struct vsp1_entity *entity, bool streaming) + + ret = v4l2_ctrl_handler_setup(entity->subdev.ctrl_handler); + if (ret < 0) { +- mutex_lock(&entity->lock); ++ spin_lock_irqsave(&entity->lock, flags); + entity->streaming = false; +- mutex_unlock(&entity->lock); ++ spin_unlock_irqrestore(&entity->lock, flags); + } + + return ret; +@@ -193,7 +195,7 @@ int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity, + if (i == ARRAY_SIZE(vsp1_routes)) + return -EINVAL; + +- mutex_init(&entity->lock); ++ spin_lock_init(&entity->lock); + + entity->vsp1 = vsp1; + entity->source_pad = num_pads - 1; +@@ -228,6 +230,4 @@ void vsp1_entity_destroy(struct vsp1_entity *entity) + if (entity->subdev.ctrl_handler) + v4l2_ctrl_handler_free(entity->subdev.ctrl_handler); + media_entity_cleanup(&entity->subdev.entity); +- +- mutex_destroy(&entity->lock); + } +diff --git a/drivers/media/platform/vsp1/vsp1_entity.h b/drivers/media/platform/vsp1/vsp1_entity.h +index 62c768d1c6aa..8867a5787c28 100644 +--- a/drivers/media/platform/vsp1/vsp1_entity.h ++++ b/drivers/media/platform/vsp1/vsp1_entity.h +@@ -14,7 +14,7 @@ + #define __VSP1_ENTITY_H__ + + #include <linux/list.h> +-#include <linux/mutex.h> ++#include <linux/spinlock.h> + + #include <media/v4l2-subdev.h> + +@@ -73,7 +73,7 @@ struct vsp1_entity { + + struct vsp1_video *video; + +- struct mutex lock; /* Protects the streaming field */ ++ spinlock_t lock; /* Protects the streaming field */ + bool streaming; + }; + +-- +2.6.2 + |