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 <herman.chen@rock-chips.com>
Change-Id: Ia0c5acc9139cfba177fb828daed6c87750a47ef1
This commit is contained in:
Herman Chen
2022-03-18 17:58:54 +08:00
committed by Tao Huang
parent 8fb18885c7
commit 298511efd0
4 changed files with 25 additions and 66 deletions

View File

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

View File

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

View File

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

View File

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