video: rockchip: mpp: fix session cleanup issue

The session can only be released after all tasks are released.

Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
Change-Id: I9a4e7940323be72cb0982338777af813888f957f
This commit is contained in:
Yandong Lin
2023-07-21 10:30:00 +08:00
committed by Tao Huang
parent c8ab145b3d
commit 99697177f4
2 changed files with 4 additions and 34 deletions

View File

@@ -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 {

View File

@@ -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();
}