Skip to content

Commit f61d500

Browse files
Sylwester Nawrockimchehab
authored andcommitted
[media] exynos4-is: Fix buffer release issue on fimc m2m video nodes
This fixes dropping ownership of buffers in the driver's stop_streaming callback, so buffers on the memory-to-memory video nodes are properly released, also in case when the driver has a buffer only on one of the queues (OUTPUT, CAPTURE) before the video node close. The issue was being reported by videobuf2 with a following warning while checking q->owned_by_drv_count: [ 2498.310766] WARNING: CPU: 0 PID: 9358 at drivers/media/v4l2-core/videobuf2-core.c:1818 __vb2_queue_cancel+0xe8/0x14c [ 2498.320258] Modules linked in: [ 2498.323212] CPU: 0 PID: 9358 Comm: v4l2_decode Not tainted 4.7.0-rc4-next-20160627 #1210 [ 2498.331284] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) [ 2498.331327] [<c010d738>] (unwind_backtrace) from [<c010a4b0>] (show_stack+0x10/0x14) [ 2498.331344] [<c010a4b0>] (show_stack) from [<c031a4ac>] (dump_stack+0x74/0x94) [ 2498.331358] [<c031a4ac>] (dump_stack) from [<c011a52c>] (__warn+0xd4/0x100) [ 2498.331369] [<c011a52c>] (__warn) from [<c011a578>] (warn_slowpath_null+0x20/0x28) [ 2498.331381] [<c011a578>] (warn_slowpath_null) from [<c04ed420>] (__vb2_queue_cancel+0xe8/0x14c) [ 2498.331395] [<c04ed420>] (__vb2_queue_cancel) from [<c04ee10c>] (vb2_core_queue_release+0x18/0x38) [ 2498.331406] [<c04ee10c>] (vb2_core_queue_release) from [<c04eab50>] (v4l2_m2m_ctx_release+0x1c/0x28) [ 2498.331420] [<c04eab50>] (v4l2_m2m_ctx_release) from [<c04fe184>] (fimc_m2m_release+0x24/0x78) [ 2498.331437] [<c04fe184>] (fimc_m2m_release) from [<c04d76c8>] (v4l2_release+0x34/0x74) [ 2498.331455] [<c04d76c8>] (v4l2_release) from [<c01dc8d4>] (__fput+0x80/0x1bc) [ 2498.331469] [<c01dc8d4>] (__fput) from [<c0132edc>] (task_work_run+0xc0/0xe4) [ 2498.331482] [<c0132edc>] (task_work_run) from [<c011d460>] (do_exit+0x304/0xa24) [ 2498.331493] [<c011d460>] (do_exit) from [<c011dccc>] (do_group_exit+0x3c/0xbc) [ 2498.331505] [<c011dccc>] (do_group_exit) from [<c0126cac>] (get_signal+0x200/0x65c) [ 2498.331517] [<c0126cac>] (get_signal) from [<c010e928>] (do_signal+0x84/0x3c4) [ 2498.331532] [<c010e928>] (do_signal) from [<c010a0ec>] (do_work_pending+0xa4/0xb4) [ 2498.331545] [<c010a0ec>] (do_work_pending) from [<c0107954>] (slow_work_pending+0xc/0x20) Reported-by: Marek Szyprowski <[email protected]> Signed-off-by: Sylwester Nawrocki <[email protected]> Signed-off-by: Kamil Debski <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent e0d80c8 commit f61d500

File tree

1 file changed

+10
-14
lines changed

1 file changed

+10
-14
lines changed

drivers/media/platform/exynos4-is/fimc-m2m.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,30 +50,28 @@ void fimc_m2m_job_finish(struct fimc_ctx *ctx, int vb_state)
5050
src_vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
5151
dst_vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
5252

53-
if (src_vb && dst_vb) {
53+
if (src_vb)
5454
v4l2_m2m_buf_done(src_vb, vb_state);
55+
if (dst_vb)
5556
v4l2_m2m_buf_done(dst_vb, vb_state);
57+
if (src_vb && dst_vb)
5658
v4l2_m2m_job_finish(ctx->fimc_dev->m2m.m2m_dev,
5759
ctx->fh.m2m_ctx);
58-
}
5960
}
6061

6162
/* Complete the transaction which has been scheduled for execution. */
62-
static int fimc_m2m_shutdown(struct fimc_ctx *ctx)
63+
static void fimc_m2m_shutdown(struct fimc_ctx *ctx)
6364
{
6465
struct fimc_dev *fimc = ctx->fimc_dev;
65-
int ret;
6666

6767
if (!fimc_m2m_pending(fimc))
68-
return 0;
68+
return;
6969

7070
fimc_ctx_state_set(FIMC_CTX_SHUT, ctx);
7171

72-
ret = wait_event_timeout(fimc->irq_queue,
73-
!fimc_ctx_state_is_set(FIMC_CTX_SHUT, ctx),
74-
FIMC_SHUTDOWN_TIMEOUT);
75-
76-
return ret == 0 ? -ETIMEDOUT : ret;
72+
wait_event_timeout(fimc->irq_queue,
73+
!fimc_ctx_state_is_set(FIMC_CTX_SHUT, ctx),
74+
FIMC_SHUTDOWN_TIMEOUT);
7775
}
7876

7977
static int start_streaming(struct vb2_queue *q, unsigned int count)
@@ -88,12 +86,10 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
8886
static void stop_streaming(struct vb2_queue *q)
8987
{
9088
struct fimc_ctx *ctx = q->drv_priv;
91-
int ret;
9289

93-
ret = fimc_m2m_shutdown(ctx);
94-
if (ret == -ETIMEDOUT)
95-
fimc_m2m_job_finish(ctx, VB2_BUF_STATE_ERROR);
9690

91+
fimc_m2m_shutdown(ctx);
92+
fimc_m2m_job_finish(ctx, VB2_BUF_STATE_ERROR);
9793
pm_runtime_put(&ctx->fimc_dev->pdev->dev);
9894
}
9995

0 commit comments

Comments
 (0)