video: rockchip: mpp: disable usr poll timeout

Use wait_event_interrupt to replace wait_event_timeout.
The task irq or task work timeout will wake up the session wait.

Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
Change-Id: I47254ca0e66b210d91578b24d63578f9ea5308f9
This commit is contained in:
Yandong Lin
2023-06-01 17:48:41 +08:00
committed by Tao Huang
parent 57de878a74
commit eecc48ce7b
3 changed files with 65 additions and 86 deletions

View File

@@ -36,8 +36,6 @@
#include "mpp_common.h"
#include "mpp_iommu.h"
#define MPP_WAIT_TIMEOUT_DELAY (2000)
/* Use 'v' as magic number */
#define MPP_IOC_MAGIC 'v'
@@ -922,23 +920,15 @@ static int mpp_wait_result_default(struct mpp_session *session,
}
mpp = mpp_get_task_used_device(task, session);
ret = wait_event_timeout(task->wait,
test_bit(TASK_STATE_DONE, &task->state),
msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY));
if (ret > 0) {
if (mpp->dev_ops->result)
ret = mpp->dev_ops->result(mpp, task, msgs);
} else {
atomic_inc(&task->abort_request);
set_bit(TASK_STATE_ABORT, &task->state);
mpp_err("timeout, pid %d session %d:%d count %d cur_task %p id %d\n",
session->pid, session->pid, session->index,
atomic_read(&session->task_count), task,
task->task_id);
}
ret = wait_event_interruptible(task->wait, test_bit(TASK_STATE_DONE, &task->state));
if (ret == -ERESTARTSYS)
mpp_err("wait task break by signal\n");
mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n",
task->task_id, kref_read(&task->ref));
if (mpp->dev_ops->result)
ret = mpp->dev_ops->result(mpp, task, msgs);
mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n",
session->device_type, session->index, atomic_read(&session->task_count),
task->task_index, task->state);
mpp_session_pop_pending(session, task);

View File

@@ -18,8 +18,6 @@
#include "hack/mpp_rkvdec2_link_hack_rk3568.c"
#define WORK_TIMEOUT_MS (500)
#define WAIT_TIMEOUT_MS (2000)
#define RKVDEC2_LINK_HACK_TASK_FLAG (0xff)
/* vdpu381 link hw info for rk3588 */
@@ -1192,19 +1190,16 @@ int rkvdec2_link_wait_result(struct mpp_session *session,
return -EIO;
}
ret = wait_event_timeout(mpp_task->wait, task_is_done(mpp_task),
msecs_to_jiffies(WAIT_TIMEOUT_MS));
if (ret) {
ret = rkvdec2_result(mpp, mpp_task, msgs);
ret = wait_event_interruptible(mpp_task->wait, task_is_done(mpp_task));
if (ret == -ERESTARTSYS)
mpp_err("wait task break by signal\n");
mpp_session_pop_done(session, mpp_task);
} else {
mpp_err("task %d:%d state %lx timeout -> abort\n",
session->index, mpp_task->task_id, mpp_task->state);
ret = rkvdec2_result(mpp, mpp_task, msgs);
atomic_inc(&mpp_task->abort_request);
set_bit(TASK_STATE_ABORT, &mpp_task->state);
}
mpp_session_pop_done(session, mpp_task);
mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n",
session->device_type, session->index, atomic_read(&session->task_count),
mpp_task->task_index, mpp_task->state);
mpp_session_pop_pending(session, mpp_task);
return ret;

View File

@@ -2049,38 +2049,31 @@ static int rkvenc2_wait_result(struct mpp_session *session,
if (!enc_task->task_split || enc_task->task_split_done) {
task_done_ret:
ret = wait_event_timeout(task->wait,
test_bit(TASK_STATE_DONE, &task->state),
msecs_to_jiffies(RKVENC2_WAIT_TIMEOUT_DELAY));
ret = wait_event_interruptible(task->wait, test_bit(TASK_STATE_DONE, &task->state));
if (ret == -ERESTARTSYS)
mpp_err("wait task break by signal in normal mode\n");
if (ret > 0)
return rkvenc2_task_default_process(mpp, task);
return rkvenc2_task_default_process(mpp, task);
rkvenc2_task_timeout_process(session, task);
return ret;
}
/* not slice return just wait all slice length */
if (!req) {
do {
ret = wait_event_timeout(task->wait,
kfifo_out(&enc_task->slice_info, &slice_info, 1),
msecs_to_jiffies(RKVENC2_WORK_TIMEOUT_DELAY));
if (ret > 0) {
mpp_dbg_slice("task %d rd %3d len %d %s\n",
task_id, enc_task->slice_rd_cnt, slice_info.slice_len,
slice_info.last ? "last" : "");
enc_task->slice_rd_cnt++;
if (slice_info.last)
goto task_done_ret;
continue;
ret = wait_event_interruptible(task->wait, kfifo_out(&enc_task->slice_info,
&slice_info, 1));
if (ret == -ERESTARTSYS) {
mpp_err("wait task break by signal in slice all mode\n");
return 0;
}
mpp_dbg_slice("task %d rd %3d len %d %s\n",
task_id, enc_task->slice_rd_cnt, slice_info.slice_len,
slice_info.last ? "last" : "");
rkvenc2_task_timeout_process(session, task);
return ret;
enc_task->slice_rd_cnt++;
if (slice_info.last)
goto task_done_ret;
} while (1);
}
@@ -2095,39 +2088,40 @@ task_done_ret:
/* handle slice mode poll return */
do {
ret = wait_event_timeout(task->wait,
kfifo_out(&enc_task->slice_info, &slice_info, 1),
msecs_to_jiffies(RKVENC2_WORK_TIMEOUT_DELAY));
if (ret > 0) {
mpp_dbg_slice("core %d task %d rd %3d len %d %s\n", task_id,
mpp->core_id, enc_task->slice_rd_cnt, slice_info.slice_len,
slice_info.last ? "last" : "");
enc_task->slice_rd_cnt++;
if (cfg.count_ret < cfg.count_max) {
struct rkvenc_poll_slice_cfg __user *ucfg =
(struct rkvenc_poll_slice_cfg __user *)(req->data);
u32 __user *dst = (u32 __user *)(ucfg + 1);
/* Do NOT return here when put_user error. Just continue */
if (put_user(slice_info.val, dst + cfg.count_ret))
ret = -EFAULT;
cfg.count_ret++;
if (put_user(cfg.count_ret, &ucfg->count_ret))
ret = -EFAULT;
}
if (slice_info.last) {
enc_task->task_split_done = 1;
goto task_done_ret;
}
if (cfg.count_ret >= cfg.count_max)
return 0;
if (ret < 0)
return ret;
ret = wait_event_interruptible(task->wait, kfifo_out(&enc_task->slice_info,
&slice_info, 1));
if (ret == -ERESTARTSYS) {
mpp_err("wait task break by signal in slice one mode\n");
return 0;
}
mpp_dbg_slice("core %d task %d rd %3d len %d %s\n", task_id,
mpp->core_id, enc_task->slice_rd_cnt, slice_info.slice_len,
slice_info.last ? "last" : "");
enc_task->slice_rd_cnt++;
if (cfg.count_ret < cfg.count_max) {
struct rkvenc_poll_slice_cfg __user *ucfg =
(struct rkvenc_poll_slice_cfg __user *)(req->data);
u32 __user *dst = (u32 __user *)(ucfg + 1);
/* Do NOT return here when put_user error. Just continue */
if (put_user(slice_info.val, dst + cfg.count_ret))
ret = -EFAULT;
cfg.count_ret++;
if (put_user(cfg.count_ret, &ucfg->count_ret))
ret = -EFAULT;
}
if (slice_info.last) {
enc_task->task_split_done = 1;
goto task_done_ret;
}
if (cfg.count_ret >= cfg.count_max)
return 0;
if (ret < 0)
return ret;
} while (ret > 0);
rkvenc2_task_timeout_process(session, task);