aboutsummaryrefslogtreecommitdiffstats
path: root/patches.renesas/0266-media-v4l-vsp1-Don-t-sleep-in-atomic-context.patch
diff options
context:
space:
mode:
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.patch105
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
+