Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Sascha Hauer" <s.hauer@pengutronix.de>
Cc: robh@kernel.org, devicetree@vger.kernel.org,
	media-ci@linuxtv.org, conor+dt@kernel.org
Subject: Re: [PATCH v6 2/4] media: rockchip: Add JPEG decoder driver
Date: Mon, 05 Oct 2026 10:02:17 +0000	[thread overview]
Message-ID: <20261005100218.301BF1F00893@smtp.kernel.org> (raw)
In-Reply-To: <20261005-rockchip-jpegdec-v6-2-25f16dea1697@pengutronix.de>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] media: rkjpegd: user-triggerable WARN_ON_ONCE in error path
- [High] pm: kernel crash from spurious IRQ reading unclocked registers
- [High] media: rkjpegd: IRQ handler wipes out watchdog soft reset
- [Medium] pm: resource leak due to missing synchronous suspend in remove
- [Medium] media: rkjpegd: data race on ctx->sequence_cap between QBUF and IRQ
--

commit e33f32166562ddeac3fb6446b67084c1666b6b89
Author: Sascha Hauer <s.hauer@pengutronix.de>

media: rockchip: Add JPEG decoder driver

Add a driver for the JPEG hardware decoder Rockchip integrates into a
number of its SoCs, exposing one V4L2 M2M device implementing the
stateful decoder interface.

> diff --git a/drivers/media/platform/rockchip/rkjpegd/rkjpegd.c b/drivers/media/platform/rockchip/rkjpegd/rkjpegd.c
> --- a/drivers/media/platform/rockchip/rkjpegd/rkjpegd.c
> +++ b/drivers/media/platform/rockchip/rkjpegd/rkjpegd.c

[ ... ]

> @@ -1388,8 +1388,9 @@ static void rkjpegd_job_finish_no_pm(struct rkjpegd_ctx *ctx,
>  
>  	src->sequence = ctx->sequence_out++;
>  	dst->sequence = ctx->sequence_cap++;
>  

[Severity: Medium]
Does this create a data race on ctx->sequence_cap?

Here in rkjpegd_job_finish_no_pm(), ctx->sequence_cap is incremented in
hardirq context protected by drain_lock. However, it is also incremented in
rkjpegd_last_buffer_done() under vdev_lock in process context.

If userspace issues a VIDIOC_QBUF on the capture queue while a drain is
ongoing, this might lead to duplicate sequence numbers or skipped counts
since the differing locks provide no mutual exclusion.

>  	/* GStreamer takes an empty capture buffer for the end of the stream. */
>  	vb2_set_plane_payload(&dst->vb2_buf, 0,
>  			      ctx->dst_fmt.plane_fmt[0].sizeimage);

[Severity: High]
Could this trigger a kernel WARN_ON_ONCE when handling an undersized buffer?

If userspace queues a frame with a larger resolution, rkjpegd_vdpu720_run()
detects the undersized capture buffer and fails with -EINVAL. The error path
jumps here, which unconditionally sets the payload size to the new, larger
ctx->dst_fmt.plane_fmt[0].sizeimage.

Because sizeimage exceeds the underlying plane length, setting it via
vb2_set_plane_payload() will trigger a warning.

[ ... ]

> @@ -1405,6 +1405,7 @@ static irqreturn_t rkjpegd_vdpu720_irq(int irq, void *dev_id)
>  	struct rkjpegd_dev *jpegd = dev_id;
>  	enum vb2_buffer_state state;
>  	u32 status;
>  
>  	status = rkjpegd_read(jpegd, VDPU720_REG_INT);
>  

[Severity: High]
Could a spurious interrupt cause a synchronous bus fault here?

The IRQ is requested via devm_request_irq() in rkjpegd_probe() before
pm_runtime_enable() is called and before resets are deasserted. If a
spurious interrupt is pending from a prior bootloader or kexec stage, the
IRQ handler fires immediately and reads VDPU720_REG_INT while the device
clocks are still disabled.

Should the handler use pm_runtime_get_if_active() to guard access, and the
IRQ be requested after PM initialization is complete?

>  	/* First phase of the IRQ clear, see VDPU720_IRQ_CLR_KEEP. */
>  	rkjpegd_write(jpegd, status & VDPU720_IRQ_CLR_KEEP, VDPU720_REG_INT);
>  
>  	if (!(status & VDPU720_IRQ_RAW))
>  		return IRQ_NONE;
>  
>  	rkjpegd_write(jpegd, 0, VDPU720_REG_INT);

[Severity: High]
Can the IRQ handler wipe out a concurrent soft reset requested by the
watchdog?

If the watchdog timeout executes vdpu720_soft_reset(), it writes
VDPU720_SOFT_RST_EN to this register. If a hardware IRQ fires concurrently,
this IRQ handler reads the register and then unconditionally writes 0 to
clear it.

This seems to wipe out the VDPU720_SOFT_RST_EN bit before the watchdog
finishes waiting for VDPU720_SOFT_RST_RDY, potentially leaving the block
wedged.

[ ... ]

> @@ -2121,6 +2121,7 @@ static void rkjpegd_remove(struct platform_device *pdev)
>  	reset_control_assert(jpegd->resets);
>  	/* Suspends at once, a pending autosuspend does not keep it active. */
>  	pm_runtime_dont_use_autosuspend(&pdev->dev);
>  	pm_runtime_disable(&pdev->dev);
>  }

[Severity: Medium]
Does this leave the hardware active and leak clocks on module unload?

If a job finishes and calls pm_runtime_put_autosuspend(), a delayed suspend
is queued. If the driver is removed before the timer fires,
pm_runtime_disable() cancels the pending autosuspend, but does not suspend
the active device.

Should the driver explicitly suspend the device synchronously before or
after disabling PM runtime?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261005-rockchip-jpegdec-v6-0-25f16dea1697@pengutronix.de?part=2

  reply	other threads:[~2026-10-05 10:02 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-05  9:46 [PATCH v6 0/4] media: rockchip: Add JPEG decoder driver Sascha Hauer
2026-10-05  9:46 ` [PATCH v6 1/4] media: dt-bindings: Add Rockchip JPEG decoder Sascha Hauer
2026-10-05  9:46 ` [PATCH v6 2/4] media: rockchip: Add JPEG decoder driver Sascha Hauer
2026-10-05 10:02   ` sashiko-bot [this message]
2026-10-05  9:46 ` [PATCH v6 3/4] arm64: dts: rockchip: rk3588: Add JPEG decoder node Sascha Hauer
2026-10-05  9:46 ` [PATCH v6 4/4] arm64: dts: rockchip: rk356x: " Sascha Hauer

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=20261005100218.301BF1F00893@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=media-ci@linuxtv.org \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox