From eecc48ce7bfed9b6cf8345f1ac406d98e30fd928 Mon Sep 17 00:00:00 2001 From: Yandong Lin Date: Thu, 1 Jun 2023 17:48:41 +0800 Subject: [PATCH] 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 Change-Id: I47254ca0e66b210d91578b24d63578f9ea5308f9 --- drivers/video/rockchip/mpp/mpp_common.c | 26 ++--- drivers/video/rockchip/mpp/mpp_rkvdec2_link.c | 21 ++-- drivers/video/rockchip/mpp/mpp_rkvenc2.c | 104 +++++++++--------- 3 files changed, 65 insertions(+), 86 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 2cb7194d940e..0f2107ac2efe 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -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); diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index 1176d2886b50..3e6f5b95d780 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -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; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 20936053221a..392ce4f46517 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -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);