From bac4740826de10cfc913cf60143fb9090c816342 Mon Sep 17 00:00:00 2001 From: Mingwei Yan Date: Thu, 23 Jan 2025 16:22:55 +0800 Subject: [PATCH] media: rockchip: vpss: fix stop don't del buffer_done_list Signed-off-by: Mingwei Yan Change-Id: Ifce8944d18678ea96910ccf07fc0c042f354ba06 --- drivers/media/platform/rockchip/vpss/stream.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/rockchip/vpss/stream.c b/drivers/media/platform/rockchip/vpss/stream.c index a018fe1bb8fb..98cf598f41dd 100644 --- a/drivers/media/platform/rockchip/vpss/stream.c +++ b/drivers/media/platform/rockchip/vpss/stream.c @@ -1081,19 +1081,31 @@ static void destroy_buf_queue(struct rkvpss_stream *stream, { unsigned long lock_flags = 0; struct rkvpss_buffer *buf; + LIST_HEAD(queue_local_list); + LIST_HEAD(done_local_list); spin_lock_irqsave(&stream->vbq_lock, lock_flags); if (stream->curr_buf) { list_add_tail(&stream->curr_buf->queue, &stream->buf_queue); stream->curr_buf = NULL; } - while (!list_empty(&stream->buf_queue)) { - buf = list_first_entry(&stream->buf_queue, struct rkvpss_buffer, queue); + list_replace_init(&stream->buf_queue, &queue_local_list); + list_replace_init(&stream->buf_done_list, &done_local_list); + spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); + + while (!list_empty(&queue_local_list)) { + buf = list_first_entry(&queue_local_list, struct rkvpss_buffer, queue); + list_del(&buf->queue); + buf->vb.vb2_buf.synced = false; + vb2_buffer_done(&buf->vb.vb2_buf, state); + } + + while (!list_empty(&done_local_list)) { + buf = list_first_entry(&done_local_list, struct rkvpss_buffer, queue); list_del(&buf->queue); buf->vb.vb2_buf.synced = false; vb2_buffer_done(&buf->vb.vb2_buf, state); } - spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } static int rkvpss_stream_crop(struct rkvpss_stream *stream, bool on, bool sync)