[PATCH] media: imx-jpeg: Fix JPEG encoder ready race condition
Ming Qian(OSS)
ming.qian at oss.nxp.com
Thu Aug 21 02:24:02 PDT 2025
Hi Marek,
On 8/21/2025 4:59 PM, Marek Vasut wrote:
> On 8/21/25 9:06 AM, Ming Qian(OSS) wrote:
>> Hi Marek,
>
> Hi,
>
>> On 8/21/2025 12:29 AM, Marek Vasut wrote:
>>> [You don't often get email from marek.vasut at mailbox.org. Learn why
>>> this is important at https://aka.ms/LearnAboutSenderIdentification ]
>>>
>>> The current mxc_jpeg_job_ready() implementation works for JPEG decode
>>> side of this IP, it does not work at all for the JPEG encode side. The
>>> JPEG encode side does not change ctx->source_change at all, therefore
>>> the mxc_jpeg_source_change() always returns right away and the encode
>>> side somehow works.
>>>
>>> However, this is susceptible to a race condition between
>>> mxc_jpeg_dec_irq()
>>> and mxc_jpeg_start_streaming(), where mxc_jpeg_start_streaming() might
>>> start decoding another frame before mxc_jpeg_dec_irq() indicates
>>> completion
>>> of encoding of current frame. Add new state, MXC_JPEG_ENC_DONE, which is
>>> set in three locations, first when streaming starts to indicate the
>>> encoder
>>> is ready to start processing a frame, second in mxc_jpeg_dec_irq()
>>> when the
>>> encoder finishes encoding current frame, and third in
>>> mxc_jpeg_dec_irq() in
>>> case of an error so the encoder can proceed with encoding another frame.
>>>
>>> Update mxc_jpeg_job_ready() to check whether the encoder is in this new
>>> MXC_JPEG_ENC_DONE state before reporting the encoder is ready to encode
>>> new frame.
>>>
>>
>> The jpeg encoder and jpeg decoder are 2 different devices, so they won't
>> compete with each other.
>
> I know.
>
>> For encoder, we always want mxc_jpeg_job_ready() to return true.
>
> For encoder, mxc_jpeg_job_ready() currently returns !ctx-
> >source_change , which is only set by decoder side of the driver. This
> seems wrong.
>
That is what we want, the ctx->source_change of encoder is never set, so
mxc_jpeg_job_ready() will always return true.
If you think this is not clear enough, maybe the following code is
enough:
if (jpeg->mode == MXC_JPEG_ENCODE)
return 1;
>> And v4l2_m2m has ensured that there will be no race condition between
>> mxc_jpeg_dec_irq() and mxc_jpeg_start_streaming().
>>
>> After v4l2_m2m_job_finish() is called in the mxc_jpeg_dec_irq(),
>> then it is possible to start encoding the next frame.
> This part would be true if the IRQ function couldn't be called by
> anything except end of configuration or end of encoding, but it can be
> triggered by other things, like AXI READ error IRQ.
The mxc_jpeg_dec_irq() has filtered out the irrelevant interrupts:
ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
if (WARN_ON(!ctx))
goto job_unlock;
if (slot != ctx->slot) {
/* TODO investigate when adding multi-instance support */
dev_warn(dev, "IRQ slot %d != context slot %d.\n",
slot, ctx->slot);
goto job_unlock;
}
if (!jpeg->slot_data.used)
goto job_unlock;
In other cases, it means the v4l2 m2m job has been started, we just need
to call v4l2_m2m_job_finish()
If CONFIG ERROR occurs, driver still call
v4l2_m2m_job_finish().
So I don't think this patch changes anything.
Regards,
Ming
More information about the linux-arm-kernel
mailing list