Commit 5c544daf authored by Qiang Yu's avatar Qiang Yu

drm/lima: use drm_sched_fault for error task handling

drm_sched_job_timedout works with drm_sched_stop as a pair,
so we'd better use the drm_sched_fault helper to make the
error and timeout handling go the same path.

This also fixes application hang when task error.
Reviewed-by: default avatarVasily Khoruzhick <anarsoul@gmail.com>
Tested-by: default avatarAndreas Baierl <ichgeh@imkreisrum.de>
Signed-off-by: default avatarQiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200101103831.22429-1-yuq825@gmail.com
parent da458286
...@@ -255,12 +255,16 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job) ...@@ -255,12 +255,16 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job)
return task->fence; return task->fence;
} }
static void lima_sched_handle_error_task(struct lima_sched_pipe *pipe, static void lima_sched_timedout_job(struct drm_sched_job *job)
struct lima_sched_task *task)
{ {
struct lima_sched_pipe *pipe = to_lima_pipe(job->sched);
struct lima_sched_task *task = to_lima_task(job);
if (!pipe->error)
DRM_ERROR("lima job timeout\n");
drm_sched_stop(&pipe->base, &task->base); drm_sched_stop(&pipe->base, &task->base);
if (task)
drm_sched_increase_karma(&task->base); drm_sched_increase_karma(&task->base);
pipe->task_error(pipe); pipe->task_error(pipe);
...@@ -284,16 +288,6 @@ static void lima_sched_handle_error_task(struct lima_sched_pipe *pipe, ...@@ -284,16 +288,6 @@ static void lima_sched_handle_error_task(struct lima_sched_pipe *pipe,
drm_sched_start(&pipe->base, true); drm_sched_start(&pipe->base, true);
} }
static void lima_sched_timedout_job(struct drm_sched_job *job)
{
struct lima_sched_pipe *pipe = to_lima_pipe(job->sched);
struct lima_sched_task *task = to_lima_task(job);
DRM_ERROR("lima job timeout\n");
lima_sched_handle_error_task(pipe, task);
}
static void lima_sched_free_job(struct drm_sched_job *job) static void lima_sched_free_job(struct drm_sched_job *job)
{ {
struct lima_sched_task *task = to_lima_task(job); struct lima_sched_task *task = to_lima_task(job);
...@@ -318,15 +312,6 @@ static const struct drm_sched_backend_ops lima_sched_ops = { ...@@ -318,15 +312,6 @@ static const struct drm_sched_backend_ops lima_sched_ops = {
.free_job = lima_sched_free_job, .free_job = lima_sched_free_job,
}; };
static void lima_sched_error_work(struct work_struct *work)
{
struct lima_sched_pipe *pipe =
container_of(work, struct lima_sched_pipe, error_work);
struct lima_sched_task *task = pipe->current_task;
lima_sched_handle_error_task(pipe, task);
}
int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name) int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
{ {
unsigned int timeout = lima_sched_timeout_ms > 0 ? unsigned int timeout = lima_sched_timeout_ms > 0 ?
...@@ -335,8 +320,6 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name) ...@@ -335,8 +320,6 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
pipe->fence_context = dma_fence_context_alloc(1); pipe->fence_context = dma_fence_context_alloc(1);
spin_lock_init(&pipe->fence_lock); spin_lock_init(&pipe->fence_lock);
INIT_WORK(&pipe->error_work, lima_sched_error_work);
return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0, return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0,
msecs_to_jiffies(timeout), name); msecs_to_jiffies(timeout), name);
} }
...@@ -349,7 +332,7 @@ void lima_sched_pipe_fini(struct lima_sched_pipe *pipe) ...@@ -349,7 +332,7 @@ void lima_sched_pipe_fini(struct lima_sched_pipe *pipe)
void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe) void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe)
{ {
if (pipe->error) if (pipe->error)
schedule_work(&pipe->error_work); drm_sched_fault(&pipe->base);
else { else {
struct lima_sched_task *task = pipe->current_task; struct lima_sched_task *task = pipe->current_task;
......
...@@ -68,8 +68,6 @@ struct lima_sched_pipe { ...@@ -68,8 +68,6 @@ struct lima_sched_pipe {
void (*task_fini)(struct lima_sched_pipe *pipe); void (*task_fini)(struct lima_sched_pipe *pipe);
void (*task_error)(struct lima_sched_pipe *pipe); void (*task_error)(struct lima_sched_pipe *pipe);
void (*task_mmu_error)(struct lima_sched_pipe *pipe); void (*task_mmu_error)(struct lima_sched_pipe *pipe);
struct work_struct error_work;
}; };
int lima_sched_task_init(struct lima_sched_task *task, int lima_sched_task_init(struct lima_sched_task *task,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment