From: sashiko-bot@kernel.org
To: "Anand Moon" <linux.amoon@gmail.com>
Cc: linux-amlogic@lists.infradead.org,
dri-devel@lists.freedesktop.org, neil.armstrong@linaro.org
Subject: Re: [PATCH v7 08/19] media: meson: vdec: Fix concurrent execution races and unsafe teardown
Date: Mon, 13 Jul 2026 12:42:34 +0000 [thread overview]
Message-ID: <20260713124235.7BE331F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260713120840.17427-9-linux.amoon@gmail.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Critical] Unconditional nullification of `core->cur_sess` in `vdec_close()` allows concurrent sessions to clobber hardware ownership, triggering interrupt storms and severe memory leaks.
- [High] AB-BA deadlock between `vdec_stop_streaming()` and `esparser_queue_all_src()` workqueue due to `cancel_work_sync()`.
- [High] Inverted loop logic in `esparser_queue_all_src()` causes infinite CPU busy-wait on hardware backpressure and premature exit on success.
- [Medium] Memory leak of `sess->priv` on the newly added `vdec_start_streaming()` error path.
--
--- Patch [8]: [PATCH v7 08/19] media: meson: vdec: Fix concurrent execution races and unsafe teardown ---
commit 4587e6bbd091d6645be624dc185c0fadded8649b
Author: Anand Moon <linux.amoon@gmail.com>
media: meson: vdec: Fix concurrent execution races and unsafe teardown
Address data races involving 'should_stop' and prevent multi-session
hardware clobbering by enforcing atomic tracking and strict owner
validation during device teardown.
> diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
> index e5d3d817b9b2b..959673742e699 100644
> --- a/drivers/staging/media/meson/vdec/esparser.c
> +++ b/drivers/staging/media/meson/vdec/esparser.c
> @@ -379,7 +379,7 @@ void esparser_queue_all_src(struct work_struct *work)
>
> scoped_guard(mutex, &sess->lock) {
> /* Safe atomic tracking check: exit loop if session is shutting down */
> - if (sess->should_stop)
> + if (READ_ONCE(sess->should_stop))
> return;
[Severity: High]
Could the workqueue get stuck in an infinite loop due to how scoped_guard
expands?
Because scoped_guard(mutex, &sess->lock) expands to a for loop, if the
inner code hits an empty queue or -EAGAIN and calls break, it will only
exit the scoped_guard loop, leaving processed_frame as false.
The code then evaluates if (processed_frame) break; which fails, executes
cond_resched(), and loops the outer while (1) infinitely.
Conversely, if a frame is successfully processed (processed_frame is true),
does the loop break entirely, causing the workqueue to exit after processing
just a single frame?
[ ... ]
> diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
> index 6fe9722577179..83a9b1238972a 100644
> --- a/drivers/staging/media/meson/vdec/vdec.c
> +++ b/drivers/staging/media/meson/vdec/vdec.c
[ ... ]
> @@ -388,10 +392,12 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
> sess->streamon_cap = 0;
>
> mutex_lock(&core->lock);
> - if (core->cur_sess == sess)
> - core->cur_sess = NULL;
> - if (sess->status != STATUS_NEEDS_RESUME)
> - sess->status = STATUS_STOPPED;
> + if (core->cur_sess == sess) {
> + /* Safely clear hardware ownership since we were confirmed as the owner */
> + smp_store_release(&core->cur_sess, NULL);
> + if (sess->status != STATUS_NEEDS_RESUME)
> + sess->status = STATUS_STOPPED;
> + }
> mutex_unlock(&core->lock);
> err_unlock_no_hw:
[Severity: Medium]
Is there a memory leak of sess->priv on the error paths in
vdec_start_streaming()?
If vdec_poweron() succeeds (which dynamically allocates sess->priv), but
a later step like kthread_run() fails, the code jumps to err_poweroff.
While the hardware state and vififo_vaddr are rolled back, kfree(sess->priv)
appears to be missing.
If VIDIOC_STREAMON repeatedly fails, could this leak kernel memory?
[ ... ]
> @@ -493,26 +502,33 @@ static void vdec_stop_streaming(struct vb2_queue *q)
> cancel_work_sync(&sess->esparser_queue_work);
[Severity: High]
Can this cause an AB-BA deadlock between the V4L2 core and the workqueue?
When userspace calls VIDIOC_STREAMOFF, the V4L2 core acquires the queue lock
(sess->lock), then calls vdec_stop_streaming(), which calls
cancel_work_sync() here.
Meanwhile, the esparser_queue_all_src() workqueue loop uses
scoped_guard(mutex, &sess->lock) to acquire the exact same lock. If the
workqueue is active, it will block waiting for sess->lock, while
vdec_stop_streaming() blocks indefinitely waiting for the workqueue to exit.
> mutex_lock(&core->lock);
>
> - vdec_poweroff(sess);
> - vdec_free_canvas(sess);
[ ... ]
> @@ -1012,21 +1031,30 @@ static int vdec_close(struct file *file)
[ ... ]
> kfree(sess->priv);
> sess->priv = NULL;
>
> + /* Unconditionally set our local status to stopped */
> + sess->status = STATUS_STOPPED;
> + /* Safely clear hardware ownership since we were confirmed as the owner */
> + smp_store_release(&core->cur_sess, NULL);
> +
[Severity: Critical]
Does this unconditionally clear the hardware ownership, even if this session
doesn't own it?
If session A is streaming and session B is closed, vdec_close() for session
B will execute smp_store_release(&core->cur_sess, NULL) outside of the
if (core->cur_sess == sess) check.
If core->cur_sess becomes NULL while session A's hardware is active, could
the next hardware interrupt trigger vdec_isr() which sees !core->cur_sess
and returns IRQ_HANDLED without clearing the hardware interrupt status?
Since the interrupt is level-triggered, could this result in an immediate
interrupt storm that hangs the CPU, and permanently leak session A's
vififo_vaddr DMA buffers when session A is eventually closed?
> mutex_unlock(&core->lock);
>
> v4l2_m2m_ctx_release(sess->m2m_ctx);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260713120840.17427-1-linux.amoon@gmail.com?part=8
WARNING: multiple messages have this Message-ID (diff)
From: sashiko-bot@kernel.org
To: "Anand Moon" <linux.amoon@gmail.com>
Cc: linux-amlogic@lists.infradead.org,
dri-devel@lists.freedesktop.org, neil.armstrong@linaro.org
Subject: Re: [PATCH v7 08/19] media: meson: vdec: Fix concurrent execution races and unsafe teardown
Date: Mon, 13 Jul 2026 12:42:34 +0000 [thread overview]
Message-ID: <20260713124235.7BE331F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260713120840.17427-9-linux.amoon@gmail.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Critical] Unconditional nullification of `core->cur_sess` in `vdec_close()` allows concurrent sessions to clobber hardware ownership, triggering interrupt storms and severe memory leaks.
- [High] AB-BA deadlock between `vdec_stop_streaming()` and `esparser_queue_all_src()` workqueue due to `cancel_work_sync()`.
- [High] Inverted loop logic in `esparser_queue_all_src()` causes infinite CPU busy-wait on hardware backpressure and premature exit on success.
- [Medium] Memory leak of `sess->priv` on the newly added `vdec_start_streaming()` error path.
--
--- Patch [8]: [PATCH v7 08/19] media: meson: vdec: Fix concurrent execution races and unsafe teardown ---
commit 4587e6bbd091d6645be624dc185c0fadded8649b
Author: Anand Moon <linux.amoon@gmail.com>
media: meson: vdec: Fix concurrent execution races and unsafe teardown
Address data races involving 'should_stop' and prevent multi-session
hardware clobbering by enforcing atomic tracking and strict owner
validation during device teardown.
> diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
> index e5d3d817b9b2b..959673742e699 100644
> --- a/drivers/staging/media/meson/vdec/esparser.c
> +++ b/drivers/staging/media/meson/vdec/esparser.c
> @@ -379,7 +379,7 @@ void esparser_queue_all_src(struct work_struct *work)
>
> scoped_guard(mutex, &sess->lock) {
> /* Safe atomic tracking check: exit loop if session is shutting down */
> - if (sess->should_stop)
> + if (READ_ONCE(sess->should_stop))
> return;
[Severity: High]
Could the workqueue get stuck in an infinite loop due to how scoped_guard
expands?
Because scoped_guard(mutex, &sess->lock) expands to a for loop, if the
inner code hits an empty queue or -EAGAIN and calls break, it will only
exit the scoped_guard loop, leaving processed_frame as false.
The code then evaluates if (processed_frame) break; which fails, executes
cond_resched(), and loops the outer while (1) infinitely.
Conversely, if a frame is successfully processed (processed_frame is true),
does the loop break entirely, causing the workqueue to exit after processing
just a single frame?
[ ... ]
> diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
> index 6fe9722577179..83a9b1238972a 100644
> --- a/drivers/staging/media/meson/vdec/vdec.c
> +++ b/drivers/staging/media/meson/vdec/vdec.c
[ ... ]
> @@ -388,10 +392,12 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
> sess->streamon_cap = 0;
>
> mutex_lock(&core->lock);
> - if (core->cur_sess == sess)
> - core->cur_sess = NULL;
> - if (sess->status != STATUS_NEEDS_RESUME)
> - sess->status = STATUS_STOPPED;
> + if (core->cur_sess == sess) {
> + /* Safely clear hardware ownership since we were confirmed as the owner */
> + smp_store_release(&core->cur_sess, NULL);
> + if (sess->status != STATUS_NEEDS_RESUME)
> + sess->status = STATUS_STOPPED;
> + }
> mutex_unlock(&core->lock);
> err_unlock_no_hw:
[Severity: Medium]
Is there a memory leak of sess->priv on the error paths in
vdec_start_streaming()?
If vdec_poweron() succeeds (which dynamically allocates sess->priv), but
a later step like kthread_run() fails, the code jumps to err_poweroff.
While the hardware state and vififo_vaddr are rolled back, kfree(sess->priv)
appears to be missing.
If VIDIOC_STREAMON repeatedly fails, could this leak kernel memory?
[ ... ]
> @@ -493,26 +502,33 @@ static void vdec_stop_streaming(struct vb2_queue *q)
> cancel_work_sync(&sess->esparser_queue_work);
[Severity: High]
Can this cause an AB-BA deadlock between the V4L2 core and the workqueue?
When userspace calls VIDIOC_STREAMOFF, the V4L2 core acquires the queue lock
(sess->lock), then calls vdec_stop_streaming(), which calls
cancel_work_sync() here.
Meanwhile, the esparser_queue_all_src() workqueue loop uses
scoped_guard(mutex, &sess->lock) to acquire the exact same lock. If the
workqueue is active, it will block waiting for sess->lock, while
vdec_stop_streaming() blocks indefinitely waiting for the workqueue to exit.
> mutex_lock(&core->lock);
>
> - vdec_poweroff(sess);
> - vdec_free_canvas(sess);
[ ... ]
> @@ -1012,21 +1031,30 @@ static int vdec_close(struct file *file)
[ ... ]
> kfree(sess->priv);
> sess->priv = NULL;
>
> + /* Unconditionally set our local status to stopped */
> + sess->status = STATUS_STOPPED;
> + /* Safely clear hardware ownership since we were confirmed as the owner */
> + smp_store_release(&core->cur_sess, NULL);
> +
[Severity: Critical]
Does this unconditionally clear the hardware ownership, even if this session
doesn't own it?
If session A is streaming and session B is closed, vdec_close() for session
B will execute smp_store_release(&core->cur_sess, NULL) outside of the
if (core->cur_sess == sess) check.
If core->cur_sess becomes NULL while session A's hardware is active, could
the next hardware interrupt trigger vdec_isr() which sees !core->cur_sess
and returns IRQ_HANDLED without clearing the hardware interrupt status?
Since the interrupt is level-triggered, could this result in an immediate
interrupt storm that hangs the CPU, and permanently leak session A's
vififo_vaddr DMA buffers when session A is eventually closed?
> mutex_unlock(&core->lock);
>
> v4l2_m2m_ctx_release(sess->m2m_ctx);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260713120840.17427-1-linux.amoon@gmail.com?part=8
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
next prev parent reply other threads:[~2026-07-13 12:42 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 12:06 [PATCH v7 00/19] media: meson: vdec: Fix lifecycles, race conditions, and stability bugs Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` [PATCH v7 01/19] media: meson: vdec: Fix m2m device lifetime and cleanup path Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:35 ` sashiko-bot
2026-07-13 12:35 ` sashiko-bot
2026-07-13 12:06 ` [PATCH v7 02/19] media: meson: vdec: Fix STREAMON / STREAMOFF race conditions and session teardown Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:38 ` sashiko-bot
2026-07-13 12:38 ` sashiko-bot
2026-07-13 12:06 ` [PATCH v7 03/19] media: meson: vdec: Fix lifecycle leaks and race conditions in recycle_thread Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:32 ` sashiko-bot
2026-07-13 12:32 ` sashiko-bot
2026-07-13 12:06 ` [PATCH v7 04/19] media: meson: vdec: Fix use-after-free race between teardown and ISR routines Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:06 ` Anand Moon
2026-07-13 12:23 ` sashiko-bot
2026-07-13 12:23 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 05/19] media: meson: vdec: Fix race condition and synchronize esparser IRQ Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:28 ` sashiko-bot
2026-07-13 12:28 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 06/19] media: meson: vdec: Fix race condition by canceling work sync Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:33 ` sashiko-bot
2026-07-13 12:33 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 07/19] media: meson: vdec: Refactor esparser work queue and fix teardown race Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:27 ` sashiko-bot
2026-07-13 12:27 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 08/19] media: meson: vdec: Fix concurrent execution races and unsafe teardown Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:42 ` sashiko-bot [this message]
2026-07-13 12:42 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 09/19] media: meson: vdec: Fix vp9 header update failure on invalid payloads Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:42 ` sashiko-bot
2026-07-13 12:42 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 10/19] media: meson: vdec: Fix race conditions and leaks in esparser pipeline Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:46 ` sashiko-bot
2026-07-13 12:46 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 11/19] media: meson: vdec: Update core m2m stream state during transitions Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:48 ` sashiko-bot
2026-07-13 12:48 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 12/19] media: meson: vdec: Coordinate m2m task execution inside async loop Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:54 ` sashiko-bot
2026-07-13 12:54 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 13/19] media: meson: vdec: Fix race conditions in job abort sequence Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:55 ` sashiko-bot
2026-07-13 12:55 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 14/19] media: meson: vdec: Correct atomic counter placement in dst_buf_done Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:48 ` sashiko-bot
2026-07-13 12:48 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 15/19] media: meson: vdec: Fix concurrent firmware loading race and hardware timeout Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:56 ` sashiko-bot
2026-07-13 12:56 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 16/19] media: meson: vdec: Configure DMA mask and segment size in probe Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:55 ` sashiko-bot
2026-07-13 12:55 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 17/19] media: meson: canvas: Fix Use-After-Free by linking canvas provider device Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:58 ` sashiko-bot
2026-07-13 12:58 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 18/19] media: meson: vdec: Increase VIFIFO buffer size to 32 MiB Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 13:06 ` sashiko-bot
2026-07-13 13:06 ` sashiko-bot
2026-07-13 12:07 ` [PATCH v7 19/19] gpu: drm: meson: Fix DMA segment size limits and maximize allocation boundaries Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:07 ` Anand Moon
2026-07-13 12:57 ` sashiko-bot
2026-07-13 12:57 ` sashiko-bot
2026-07-13 14:04 ` Nicolas Dufresne
2026-07-13 14:04 ` Nicolas Dufresne
2026-07-14 7:23 ` [PATCH v7 00/19] media: meson: vdec: Fix lifecycles, race conditions, and stability bugs Anand Moon
2026-07-14 7:23 ` Anand Moon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260713124235.7BE331F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-amlogic@lists.infradead.org \
--cc=linux.amoon@gmail.com \
--cc=neil.armstrong@linaro.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.