From 99697177f42ef521338c2ccd44bf925e7a65672a Mon Sep 17 00:00:00 2001 From: Yandong Lin Date: Fri, 21 Jul 2023 10:30:00 +0800 Subject: [PATCH] video: rockchip: mpp: fix session cleanup issue The session can only be released after all tasks are released. Signed-off-by: Yandong Lin Change-Id: I9a4e7940323be72cb0982338777af813888f957f --- drivers/video/rockchip/mpp/mpp_common.c | 6 ++-- drivers/video/rockchip/mpp/mpp_rkvdec2_link.c | 32 +------------------ 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 0f2107ac2efe..aa84cc813a94 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -353,9 +353,9 @@ void mpp_session_cleanup_detach(struct mpp_taskqueue *queue, struct kthread_work mutex_unlock(&queue->session_lock); if (task_count) { - mpp_dbg_session("session %d:%d task not finished %d\n", - session->pid, session->index, - atomic_read(&queue->detach_count)); + mpp_dbg_session("session %d:%d not finished %d task cnt %d\n", + session->device_type, session->index, + atomic_read(&queue->detach_count), task_count); mpp_session_clear_pending(session); } else { diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index 3e6f5b95d780..339e7086e1a8 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -1835,36 +1835,6 @@ static bool rkvdec2_core_working(struct mpp_taskqueue *queue) return flag; } -static int rkvdec2_ccu_link_session_detach(struct mpp_dev *mpp, - struct mpp_taskqueue *queue) -{ - mutex_lock(&queue->session_lock); - while (atomic_read(&queue->detach_count)) { - struct mpp_session *session = NULL; - - session = list_first_entry_or_null(&queue->session_detach, - struct mpp_session, - session_link); - if (session) { - list_del_init(&session->session_link); - atomic_dec(&queue->detach_count); - } - - mutex_unlock(&queue->session_lock); - - if (session) { - mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev), - atomic_read(&queue->detach_count)); - mpp_session_deinit(session); - } - - mutex_lock(&queue->session_lock); - } - mutex_unlock(&queue->session_lock); - - return 0; -} - void rkvdec2_soft_ccu_worker(struct kthread_work *work_s) { struct mpp_task *mpp_task; @@ -1939,7 +1909,7 @@ void rkvdec2_soft_ccu_worker(struct kthread_work *work_s) rkvdec2_ccu_power_off(queue, dec->ccu); /* 5. check session detach out of queue */ - rkvdec2_ccu_link_session_detach(mpp, queue); + mpp_session_cleanup_detach(queue, work_s); mpp_debug_leave(); }