Re: [PATCH v1 4/7] media: chips-media: wave5: Add timeout while stop_streaming

From: Nicolas Dufresne

Date: Wed Jul 15 2026 - 22:08:38 EST


Le vendredi 26 juin 2026 à 10:22 +0900, Jackson.lee a écrit :
> From: Jackson Lee <jackson.lee@xxxxxxxxxxxxxxx>
>
> When stop_streaming is called, an infinite loop may occur in some cases.
> Add a bounded poll of the queue status: loop until the queues drain,
> sleeping briefly between polls, and bail out once VPU_DEC_STOP_TIMEOUT
> elapses.
>
> Fixes: 9707a6254a8a ("media: chips-media: wave5: Add the v4l2 layer")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Jackson Lee <jackson.lee@xxxxxxxxxxxxxxx>
> Signed-off-by: Nas Chung <nas.chung@xxxxxxxxxxxxxxx>

This is not the nicest thing to do, but I don't really have a better idea. We'd
need something from the firmware to signal this instead. The code was clearly
prone to spinning and CPU hugging, even if the HW was behaving, so I'll admit
this is an improvement.

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxx>

> ---
>  .../platform/chips-media/wave5/wave5-vpu-dec.c    | 15 +++++++++------
>  .../platform/chips-media/wave5/wave5-vpuconfig.h  |  2 +-
>  2 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
> index 6c6e86b09b40..93f7b724d86c 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
> +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
> @@ -5,6 +5,7 @@
>   * Copyright (C) 2021-2023 CHIPS&MEDIA INC
>   */
>  
> +#include <linux/delay.h>
>  #include <linux/pm_runtime.h>
>  #include "wave5-helper.h"
>  
> @@ -1537,15 +1538,15 @@ static void wave5_vpu_dec_stop_streaming(struct vb2_queue *q)
>  {
>   struct vpu_instance *inst = vb2_get_drv_priv(q);
>   struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx;
> -
> - bool check_cmd = TRUE;
> + unsigned long timeout;
>  
>   dev_dbg(inst->dev->dev, "%s: type: %u\n", __func__, q->type);
>   pm_runtime_resume_and_get(inst->dev->dev);
>   inst->empty_queue = true;
> - while (check_cmd) {
> +
> + timeout = jiffies + msecs_to_jiffies(VPU_DEC_STOP_TIMEOUT);
> + while (true) {
>   struct queue_status_info q_status;
> - struct dec_output_info dec_output_info;
>  
>   wave5_vpu_dec_give_command(inst, DEC_GET_QUEUE_STATUS, &q_status);
>   if ((inst->state == VPU_INST_STATE_STOP ||
> @@ -1554,8 +1555,10 @@ static void wave5_vpu_dec_stop_streaming(struct vb2_queue *q)
>   q_status.report_queue_count == 0)
>   break;
>  
> - if (wave5_vpu_dec_get_output_info(inst, &dec_output_info))
> - dev_dbg(inst->dev->dev, "there is no output info\n");
> + if (time_after(jiffies, timeout))
> + break;
> +
> + usleep_range(1000, 2000);
>   }
>  
>   v4l2_m2m_update_stop_streaming_state(m2m_ctx, q);
> diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h b/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
> index 4ebd48d5550e..e04f2dbf3b65 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
> +++ b/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
> @@ -59,7 +59,7 @@
>  //  application specific configuration
>  #define VPU_ENC_TIMEOUT                 60000
>  #define VPU_DEC_TIMEOUT                 60000
> -#define VPU_DEC_STOP_TIMEOUT            10
> +#define VPU_DEC_STOP_TIMEOUT            300
>  
>  // for WAVE encoder
>  #define USE_SRC_PRP_AXI         0

Attachment: signature.asc
Description: This is a digitally signed message part