mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user