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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux