From 298511efd0f40fa278d5db3e645a2bca0eede07e Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Fri, 18 Mar 2022 17:58:54 +0800 Subject: [PATCH] video: rockchip: mpp: rkvenc2: Add task id Use task_id in taskqueue to identify each task while task_index in mpp_dev will have conflict in multi-core case. Signed-off-by: Herman Chen Change-Id: Ia0c5acc9139cfba177fb828daed6c87750a47ef1 --- drivers/video/rockchip/mpp/mpp_common.c | 12 +++-- drivers/video/rockchip/mpp/mpp_common.h | 2 + drivers/video/rockchip/mpp/mpp_rkvdec2_link.c | 27 +++++----- drivers/video/rockchip/mpp/mpp_rkvenc2.c | 50 +------------------ 4 files changed, 25 insertions(+), 66 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 2ca15132fdf9..8c6e0d1519f3 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -496,7 +496,7 @@ void mpp_free_task(struct kref *ref) session = task->session; mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d free state 0x%lx abort %d\n", - session->index, task->task_index, task->state, + session->index, task->task_id, task->state, atomic_read(&task->abort_request)); mpp = mpp_get_task_used_device(task, session); @@ -573,6 +573,7 @@ static int mpp_process_task_default(struct mpp_session *session, init_waitqueue_head(&task->wait); atomic_set(&task->abort_request, 0); task->task_index = atomic_fetch_inc(&mpp->task_index); + task->task_id = atomic_fetch_inc(&mpp->queue->task_id); INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work); if (mpp->auto_freq_en && mpp->hw_ops->get_freq) @@ -836,14 +837,14 @@ static int mpp_wait_result_default(struct mpp_session *session, } else { atomic_inc(&task->abort_request); set_bit(TASK_STATE_ABORT, &task->state); - mpp_err("timeout, pid %d session %p:%d count %d cur_task %p index %d.\n", + mpp_err("timeout, pid %d session %p:%d count %d cur_task %p id %d\n", session->pid, session, session->index, atomic_read(&session->task_count), task, - task->task_index); + task->task_id); } mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n", - task->task_index, kref_read(&task->ref)); + task->task_id, kref_read(&task->ref)); mpp_session_pop_pending(session, task); @@ -946,6 +947,7 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev) /* default taskqueue has max 16 task capacity */ queue->task_capacity = MPP_MAX_TASK_CAPACITY; atomic_set(&queue->reset_request, 0); + atomic_set(&queue->task_id, 0); return queue; } @@ -1492,7 +1494,7 @@ static void mpp_msgs_trigger(struct list_head *msgs_list) } if (test_bit(TASK_STATE_ABORT, &task->state)) - pr_info("try to trigger abort task %d\n", task->task_index); + pr_info("try to trigger abort task %d\n", task->task_id); atomic_inc(&mpp->task_count); diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 9e98278dc10f..183d562d2828 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -448,6 +448,7 @@ struct mpp_task { /* hardware info for current task */ struct mpp_hw_info *hw_info; u32 task_index; + u32 task_id; u32 *reg; /* event for session wait thread */ wait_queue_head_t wait; @@ -471,6 +472,7 @@ struct mpp_taskqueue { struct list_head session_detach; u32 detach_count; + atomic_t task_id; /* lock for pending list */ struct mutex pending_lock; struct list_head pending_list; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index db959b2c23dc..6fb3a8a738c7 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -366,7 +366,7 @@ static int rkvdec_link_write_task_to_slot(struct rkvdec_link_dev *dev, int idx, dev->task_to_run++; dev->task_prepared++; mpp_dbg_link_flow("slot %d write task %d\n", slot_idx, - mpp_task->task_index); + mpp_task->task_id); return 0; } @@ -572,7 +572,7 @@ static int rkvdec_link_isr_recv_task(struct mpp_dev *mpp, regs = table_base + idx * link_dec->link_reg_count; irq_status = regs[info->tb_reg_int]; mpp_dbg_link_flow("slot %d rd task %d\n", idx, - mpp_task->task_index); + mpp_task->task_id); task->irq_status = irq_status; @@ -968,13 +968,13 @@ static void rkvdec2_link_free_task(struct kref *ref) struct mpp_task *task = container_of(ref, struct mpp_task, ref); if (!task->session) { - mpp_err("task %d task->session is null.\n", task->task_index); + mpp_err("task %d task->session is null.\n", task->task_id); return; } session = task->session; mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d state 0x%lx\n", - session->index, task->task_index, task->state); + session->index, task->task_id, task->state); if (!session->mpp) { mpp_err("session %d session->mpp is null.\n", session->index); return; @@ -1064,19 +1064,19 @@ static void rkvdec2_link_timeout_proc(struct work_struct *work_s) if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) { mpp_err("task %d state %lx has been handled\n", - task->task_index, task->state); + task->task_id, task->state); return; } if (!task->session) { - mpp_err("task %d session is null.\n", task->task_index); + mpp_err("task %d session is null.\n", task->task_id); return; } session = task->session; if (!session->mpp) { mpp_err("task %d:%d mpp is null.\n", session->index, - task->task_index); + task->task_id); return; } mpp = session->mpp; @@ -1171,7 +1171,7 @@ static int mpp_task_queue(struct mpp_dev *mpp, struct mpp_task *task) /* prepare the task for running */ if (test_and_set_bit(TASK_STATE_PREPARE, &task->state)) - mpp_err("task %d has been prepare twice\n", task->task_index); + mpp_err("task %d has been prepare twice\n", task->task_id); rkvdec2_link_prepare(mpp, task); @@ -1257,6 +1257,7 @@ int rkvdec2_link_process_task(struct mpp_session *session, kref_init(&task->ref); atomic_set(&task->abort_request, 0); task->task_index = atomic_fetch_inc(&mpp->task_index); + task->task_id = atomic_fetch_inc(&mpp->queue->task_id); INIT_DELAYED_WORK(&task->timeout_work, rkvdec2_link_timeout_proc); atomic_inc(&session->task_count); @@ -1304,7 +1305,7 @@ int rkvdec2_link_wait_result(struct mpp_session *session, mpp_session_pop_done(session, mpp_task); } else { mpp_err("task %d:%d statue %lx timeout -> abort\n", - session->index, mpp_task->task_index, mpp_task->state); + session->index, mpp_task->task_id, mpp_task->state); atomic_inc(&mpp_task->abort_request); set_bit(TASK_STATE_ABORT, &mpp_task->state); @@ -1375,7 +1376,7 @@ again: if (mpp_task_queue(mpp, task)) { /* failed to run */ mpp_err("%p failed to process task %p:%d\n", - mpp, task, task->task_index); + mpp, task, task->task_id); } else { mutex_lock(&queue->pending_lock); set_bit(TASK_STATE_RUNNING, &task->state); @@ -1512,19 +1513,19 @@ static void rkvdec2_ccu_link_timeout_work(struct work_struct *work_s) if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) { mpp_err("task %d state %lx has been handled\n", - task->task_index, task->state); + task->task_id, task->state); return; } if (!task->session) { - mpp_err("task %d session is null.\n", task->task_index); + mpp_err("task %d session is null.\n", task->task_id); return; } session = task->session; if (!session->mpp) { mpp_err("task %d:%d mpp is null.\n", session->index, - task->task_index); + task->task_id); return; } mpp = task->mpp ? task->mpp : session->mpp; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 0c55f46e4a60..72e48a95027f 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -610,38 +610,6 @@ static int rkvenc_task_get_format(struct mpp_dev *mpp, return 0; } -static struct rkvenc_dev *rkvenc_core_balance(struct rkvenc_ccu *ccu) -{ - struct rkvenc_dev *enc; - struct rkvenc_dev *core = NULL, *n; - - mpp_debug_enter(); - - mutex_lock(&ccu->lock); - enc = list_first_entry(&ccu->core_list, struct rkvenc_dev, core_link); - list_for_each_entry_safe(core, n, &ccu->core_list, core_link) { - mpp_debug(DEBUG_DEVICE, "%s, disable_work=%d, task_count=%d, task_index=%d\n", - dev_name(core->mpp.dev), core->disable_work, - atomic_read(&core->mpp.task_count), atomic_read(&core->mpp.task_index)); - /* if core (except main-core) disabled, skip it */ - if (core->disable_work) - continue; - /* choose core with less task in queue */ - if (atomic_read(&core->mpp.task_count) < atomic_read(&enc->mpp.task_count)) { - enc = core; - break; - } - /* choose core with less task which done */ - if (atomic_read(&core->mpp.task_index) < atomic_read(&enc->mpp.task_index)) - enc = core; - } - mutex_unlock(&ccu->lock); - - mpp_debug_leave(); - - return enc; -} - static int rkvenc2_set_rcbbuf(struct mpp_dev *mpp, struct mpp_session *session, struct rkvenc_task *task) { @@ -819,20 +787,6 @@ free_task: return NULL; } -static void *rkvenc_ccu_alloc_task(struct mpp_session *session, - struct mpp_task_msgs *msgs) -{ - struct rkvenc_dev *enc = to_rkvenc_dev(session->mpp); - - /* if multi-cores, choose one for current task */ - if (enc->ccu) { - enc = rkvenc_core_balance(enc->ccu); - session->mpp = &enc->mpp; - } - - return rkvenc_alloc_task(session, msgs); -} - static void *rkvenc2_prepare(struct mpp_dev *mpp, struct mpp_task *mpp_task) { struct mpp_taskqueue *queue = mpp->queue; @@ -1573,7 +1527,7 @@ static void rkvenc2_task_timeout_process(struct mpp_session *session, mpp_err("session %d:%d count %d task %d ref %d timeout\n", session->pid, session->index, atomic_read(&session->task_count), - task->task_index, kref_read(&task->ref)); + task->task_id, kref_read(&task->ref)); rkvenc2_task_pop_pending(task); } @@ -1699,7 +1653,7 @@ static struct mpp_dev_ops rkvenc_dev_ops_v2 = { static struct mpp_dev_ops rkvenc_ccu_dev_ops = { .wait_result = rkvenc2_wait_result, - .alloc_task = rkvenc_ccu_alloc_task, + .alloc_task = rkvenc_alloc_task, .prepare = rkvenc2_prepare, .run = rkvenc_run, .irq = rkvenc_irq,