mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-22 12:32:00 +07:00
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: Vasily Khoruzhick <anarsoul@gmail.com> Tested-by: Andreas Baierl <ichgeh@imkreisrum.de> Signed-off-by: Qiang Yu <yuq825@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200101103831.22429-1-yuq825@gmail.com
This commit is contained in:
parent
da458286a5
commit
5c544dafc0
@ -255,13 +255,17 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job)
|
||||
return task->fence;
|
||||
}
|
||||
|
||||
static void lima_sched_handle_error_task(struct lima_sched_pipe *pipe,
|
||||
struct lima_sched_task *task)
|
||||
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);
|
||||
|
||||
if (!pipe->error)
|
||||
DRM_ERROR("lima job timeout\n");
|
||||
|
||||
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);
|
||||
|
||||
@ -284,16 +288,6 @@ static void lima_sched_handle_error_task(struct lima_sched_pipe *pipe,
|
||||
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)
|
||||
{
|
||||
struct lima_sched_task *task = to_lima_task(job);
|
||||
@ -318,15 +312,6 @@ static const struct drm_sched_backend_ops lima_sched_ops = {
|
||||
.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)
|
||||
{
|
||||
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)
|
||||
pipe->fence_context = dma_fence_context_alloc(1);
|
||||
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,
|
||||
msecs_to_jiffies(timeout), name);
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
if (pipe->error)
|
||||
schedule_work(&pipe->error_work);
|
||||
drm_sched_fault(&pipe->base);
|
||||
else {
|
||||
struct lima_sched_task *task = pipe->current_task;
|
||||
|
||||
|
@ -68,8 +68,6 @@ struct lima_sched_pipe {
|
||||
void (*task_fini)(struct lima_sched_pipe *pipe);
|
||||
void (*task_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,
|
||||
|
Loading…
Reference in New Issue
Block a user