Thanks, applied to drm-misc-next. Regards, Qiang On Tue, Jan 7, 2020 at 4:16 PM Andreas Baierl <list@xxxxxxxxxxxxx> wrote: > > Am 03.01.2020 um 06:46 schrieb Vasily Khoruzhick: > > On Wed, Jan 1, 2020 at 2:39 AM Qiang Yu <yuq825@xxxxxxxxx> wrote: > >> 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. > >> > >> Signed-off-by: Qiang Yu <yuq825@xxxxxxxxx> > > LGTM in general. > > > > Reviewed-by: Vasily Khoruzhick <anarsoul@xxxxxxxxx> > > > > Erico, Andreas, could you test this patch on actual hardware? I'll > > have pretty limited access to the hardware for next few weeks, so I > > won't be able to test it myself. > I've tested that one on top of a recent kernel (3a562aee727a) on a > Mali450/ Allwinner H5 device with deqp and got no regressions and kernel > issues. > So... > > Tested-by: Andreas Baierl <ichgeh@xxxxxxxxxxxxx> > >> --- > >> drivers/gpu/drm/lima/lima_sched.c | 35 ++++++++----------------------- > >> drivers/gpu/drm/lima/lima_sched.h | 2 -- > >> 2 files changed, 9 insertions(+), 28 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c > >> index f522c5f99729..a31a90c380b6 100644 > >> --- a/drivers/gpu/drm/lima/lima_sched.c > >> +++ b/drivers/gpu/drm/lima/lima_sched.c > >> @@ -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; > >> > >> diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h > >> index 928af91c1118..1d814fecbcc0 100644 > >> --- a/drivers/gpu/drm/lima/lima_sched.h > >> +++ b/drivers/gpu/drm/lima/lima_sched.h > >> @@ -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, > >> -- > >> 2.17.1 > >> > > _______________________________________________ > > dri-devel mailing list > > dri-devel@xxxxxxxxxxxxxxxxxxxxx > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel