[PATCH] drm/lima: use drm_sched_fault for error task handling

Andreas Baierl list at imkreisrum.de
Tue Jan 7 08:16:29 UTC 2020


Am 03.01.2020 um 06:46 schrieb Vasily Khoruzhick:
> On Wed, Jan 1, 2020 at 2:39 AM Qiang Yu <yuq825 at gmail.com> 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 at gmail.com>
> LGTM in general.
>
> Reviewed-by: Vasily Khoruzhick <anarsoul at gmail.com>
>
> 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 at imkreisrum.de>
>> ---
>>   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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel



More information about the dri-devel mailing list