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

Vasily Khoruzhick anarsoul at gmail.com
Fri Jan 3 05:46:21 UTC 2020


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.

> ---
>  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
>


More information about the dri-devel mailing list