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