]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: v4l2-mem2mem: add lock to protect parameter num_rdy
authorYunfei Dong <yunfei.dong@mediatek.com>
Mon, 17 Apr 2023 08:17:40 +0000 (16:17 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 26 Aug 2023 12:23:23 +0000 (14:23 +0200)
[ Upstream commit 56b5c3e67b0f9af3f45cf393be048ee8d8a92694 ]

Getting below error when using KCSAN to check the driver. Adding lock to
protect parameter num_rdy when getting the value with function:
v4l2_m2m_num_src_bufs_ready/v4l2_m2m_num_dst_bufs_ready.

kworker/u16:3: [name:report&]BUG: KCSAN: data-race in v4l2_m2m_buf_queue
kworker/u16:3: [name:report&]

kworker/u16:3: [name:report&]read-write to 0xffffff8105f35b94 of 1 bytes by task 20865 on cpu 7:
kworker/u16:3:  v4l2_m2m_buf_queue+0xd8/0x10c

Signed-off-by: Pina Chen <pina.chen@mediatek.com>
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/media/v4l2-mem2mem.h

index 5a91b548ecc0cc8dd7eeb97ad4346d23e546af65..8d52c4506762d8ea4f04fb42c53a6292c633415b 100644 (file)
@@ -588,7 +588,14 @@ void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx,
 static inline
 unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
 {
-       return m2m_ctx->out_q_ctx.num_rdy;
+       unsigned int num_buf_rdy;
+       unsigned long flags;
+
+       spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
+       num_buf_rdy = m2m_ctx->out_q_ctx.num_rdy;
+       spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
+
+       return num_buf_rdy;
 }
 
 /**
@@ -600,7 +607,14 @@ unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
 static inline
 unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
 {
-       return m2m_ctx->cap_q_ctx.num_rdy;
+       unsigned int num_buf_rdy;
+       unsigned long flags;
+
+       spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags);
+       num_buf_rdy = m2m_ctx->cap_q_ctx.num_rdy;
+       spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags);
+
+       return num_buf_rdy;
 }
 
 /**