All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper
@ 2018-10-09 11:19 Christian König
  2018-10-09 11:19 ` [PATCH 2/2] drm/sched: fix timeout handling v2 Christian König
  2018-10-09 16:25 ` [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Nayan Deshmukh
  0 siblings, 2 replies; 4+ messages in thread
From: Christian König @ 2018-10-09 11:19 UTC (permalink / raw)
  To: dri-devel

Cleanup starting the timeout a bit.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/scheduler/sched_main.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index 4e8505d51795..bd7d11c47202 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -182,6 +182,20 @@ bool drm_sched_dependency_optimized(struct dma_fence* fence,
 }
 EXPORT_SYMBOL(drm_sched_dependency_optimized);
 
+/**
+ * drm_sched_start_timeout - start timeout for reset worker
+ *
+ * @sched: scheduler instance to start the worker for
+ *
+ * Start the timeout for the given scheduler.
+ */
+static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
+{
+	if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
+	    !list_empty(&sched->ring_mirror_list))
+		schedule_delayed_work(&sched->work_tdr, sched->timeout);
+}
+
 /* job_finish is called after hw fence signaled
  */
 static void drm_sched_job_finish(struct work_struct *work)
@@ -203,9 +217,7 @@ static void drm_sched_job_finish(struct work_struct *work)
 	/* remove job from ring_mirror_list */
 	list_del(&s_job->node);
 	/* queue TDR for next job */
-	if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
-	    !list_empty(&sched->ring_mirror_list))
-		schedule_delayed_work(&sched->work_tdr, sched->timeout);
+	drm_sched_start_timeout(sched);
 	spin_unlock(&sched->job_list_lock);
 
 	dma_fence_put(&s_job->s_fence->finished);
@@ -229,10 +241,7 @@ static void drm_sched_job_begin(struct drm_sched_job *s_job)
 
 	spin_lock(&sched->job_list_lock);
 	list_add_tail(&s_job->node, &sched->ring_mirror_list);
-	if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
-	    list_first_entry_or_null(&sched->ring_mirror_list,
-				     struct drm_sched_job, node) == s_job)
-		schedule_delayed_work(&sched->work_tdr, sched->timeout);
+	drm_sched_start_timeout(sched);
 	spin_unlock(&sched->job_list_lock);
 }
 
@@ -313,11 +322,6 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched)
 	int r;
 
 	spin_lock(&sched->job_list_lock);
-	s_job = list_first_entry_or_null(&sched->ring_mirror_list,
-					 struct drm_sched_job, node);
-	if (s_job && sched->timeout != MAX_SCHEDULE_TIMEOUT)
-		schedule_delayed_work(&sched->work_tdr, sched->timeout);
-
 	list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
 		struct drm_sched_fence *s_fence = s_job->s_fence;
 		struct dma_fence *fence;
@@ -350,6 +354,7 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched)
 		}
 		spin_lock(&sched->job_list_lock);
 	}
+	drm_sched_start_timeout(sched);
 	spin_unlock(&sched->job_list_lock);
 }
 EXPORT_SYMBOL(drm_sched_job_recovery);
-- 
2.14.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] drm/sched: fix timeout handling v2
  2018-10-09 11:19 [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Christian König
@ 2018-10-09 11:19 ` Christian König
  2018-10-09 16:25   ` Nayan Deshmukh
  2018-10-09 16:25 ` [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Nayan Deshmukh
  1 sibling, 1 reply; 4+ messages in thread
From: Christian König @ 2018-10-09 11:19 UTC (permalink / raw)
  To: dri-devel

We need to make sure that we don't race between job completion and
timeout.

v2: put revert label after calling the handling manually

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/scheduler/sched_main.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index bd7d11c47202..44fe587aaef9 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -249,13 +249,41 @@ static void drm_sched_job_timedout(struct work_struct *work)
 {
 	struct drm_gpu_scheduler *sched;
 	struct drm_sched_job *job;
+	int r;
 
 	sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work);
+
+	spin_lock(&sched->job_list_lock);
+	list_for_each_entry_reverse(job, &sched->ring_mirror_list, node) {
+		struct drm_sched_fence *fence = job->s_fence;
+
+		if (!dma_fence_remove_callback(fence->parent, &fence->cb))
+			goto already_signaled;
+	}
+
 	job = list_first_entry_or_null(&sched->ring_mirror_list,
 				       struct drm_sched_job, node);
+	spin_unlock(&sched->job_list_lock);
 
 	if (job)
-		job->sched->ops->timedout_job(job);
+		sched->ops->timedout_job(job);
+
+	spin_lock(&sched->job_list_lock);
+	list_for_each_entry(job, &sched->ring_mirror_list, node) {
+		struct drm_sched_fence *fence = job->s_fence;
+
+		if (!fence->parent || !list_empty(&fence->cb.node))
+			continue;
+
+		r = dma_fence_add_callback(fence->parent, &fence->cb,
+					   drm_sched_process_job);
+		if (r)
+			drm_sched_process_job(fence->parent, &fence->cb);
+
+already_signaled:
+		;
+	}
+	spin_unlock(&sched->job_list_lock);
 }
 
 /**
-- 
2.14.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper
  2018-10-09 11:19 [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Christian König
  2018-10-09 11:19 ` [PATCH 2/2] drm/sched: fix timeout handling v2 Christian König
@ 2018-10-09 16:25 ` Nayan Deshmukh
  1 sibling, 0 replies; 4+ messages in thread
From: Nayan Deshmukh @ 2018-10-09 16:25 UTC (permalink / raw)
  To: ckoenig.leichtzumerken; +Cc: Maling list - DRI developers

On Tue, Oct 9, 2018 at 8:20 PM Christian König
<ckoenig.leichtzumerken@gmail.com> wrote:
>
> Cleanup starting the timeout a bit.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Nayan Deshmukh <nayan26deshmukh@gmail.com>
> ---
>  drivers/gpu/drm/scheduler/sched_main.c | 29 +++++++++++++++++------------
>  1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
> index 4e8505d51795..bd7d11c47202 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -182,6 +182,20 @@ bool drm_sched_dependency_optimized(struct dma_fence* fence,
>  }
>  EXPORT_SYMBOL(drm_sched_dependency_optimized);
>
> +/**
> + * drm_sched_start_timeout - start timeout for reset worker
> + *
> + * @sched: scheduler instance to start the worker for
> + *
> + * Start the timeout for the given scheduler.
> + */
> +static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
> +{
> +       if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
> +           !list_empty(&sched->ring_mirror_list))
> +               schedule_delayed_work(&sched->work_tdr, sched->timeout);
> +}
> +
>  /* job_finish is called after hw fence signaled
>   */
>  static void drm_sched_job_finish(struct work_struct *work)
> @@ -203,9 +217,7 @@ static void drm_sched_job_finish(struct work_struct *work)
>         /* remove job from ring_mirror_list */
>         list_del(&s_job->node);
>         /* queue TDR for next job */
> -       if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
> -           !list_empty(&sched->ring_mirror_list))
> -               schedule_delayed_work(&sched->work_tdr, sched->timeout);
> +       drm_sched_start_timeout(sched);
>         spin_unlock(&sched->job_list_lock);
>
>         dma_fence_put(&s_job->s_fence->finished);
> @@ -229,10 +241,7 @@ static void drm_sched_job_begin(struct drm_sched_job *s_job)
>
>         spin_lock(&sched->job_list_lock);
>         list_add_tail(&s_job->node, &sched->ring_mirror_list);
> -       if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
> -           list_first_entry_or_null(&sched->ring_mirror_list,
> -                                    struct drm_sched_job, node) == s_job)
> -               schedule_delayed_work(&sched->work_tdr, sched->timeout);
> +       drm_sched_start_timeout(sched);
>         spin_unlock(&sched->job_list_lock);
>  }
>
> @@ -313,11 +322,6 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched)
>         int r;
>
>         spin_lock(&sched->job_list_lock);
> -       s_job = list_first_entry_or_null(&sched->ring_mirror_list,
> -                                        struct drm_sched_job, node);
> -       if (s_job && sched->timeout != MAX_SCHEDULE_TIMEOUT)
> -               schedule_delayed_work(&sched->work_tdr, sched->timeout);
> -
>         list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
>                 struct drm_sched_fence *s_fence = s_job->s_fence;
>                 struct dma_fence *fence;
> @@ -350,6 +354,7 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched)
>                 }
>                 spin_lock(&sched->job_list_lock);
>         }
> +       drm_sched_start_timeout(sched);
>         spin_unlock(&sched->job_list_lock);
>  }
>  EXPORT_SYMBOL(drm_sched_job_recovery);
> --
> 2.14.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] drm/sched: fix timeout handling v2
  2018-10-09 11:19 ` [PATCH 2/2] drm/sched: fix timeout handling v2 Christian König
@ 2018-10-09 16:25   ` Nayan Deshmukh
  0 siblings, 0 replies; 4+ messages in thread
From: Nayan Deshmukh @ 2018-10-09 16:25 UTC (permalink / raw)
  To: ckoenig.leichtzumerken; +Cc: Maling list - DRI developers

On Tue, Oct 9, 2018 at 8:20 PM Christian König
<ckoenig.leichtzumerken@gmail.com> wrote:
>
> We need to make sure that we don't race between job completion and
> timeout.
>
> v2: put revert label after calling the handling manually
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Nayan Deshmukh <nayan26deshmukh@gmail.com>
> ---
>  drivers/gpu/drm/scheduler/sched_main.c | 30 +++++++++++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
> index bd7d11c47202..44fe587aaef9 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -249,13 +249,41 @@ static void drm_sched_job_timedout(struct work_struct *work)
>  {
>         struct drm_gpu_scheduler *sched;
>         struct drm_sched_job *job;
> +       int r;
>
>         sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work);
> +
> +       spin_lock(&sched->job_list_lock);
> +       list_for_each_entry_reverse(job, &sched->ring_mirror_list, node) {
> +               struct drm_sched_fence *fence = job->s_fence;
> +
> +               if (!dma_fence_remove_callback(fence->parent, &fence->cb))
> +                       goto already_signaled;
> +       }
> +
>         job = list_first_entry_or_null(&sched->ring_mirror_list,
>                                        struct drm_sched_job, node);
> +       spin_unlock(&sched->job_list_lock);
>
>         if (job)
> -               job->sched->ops->timedout_job(job);
> +               sched->ops->timedout_job(job);
> +
> +       spin_lock(&sched->job_list_lock);
> +       list_for_each_entry(job, &sched->ring_mirror_list, node) {
> +               struct drm_sched_fence *fence = job->s_fence;
> +
> +               if (!fence->parent || !list_empty(&fence->cb.node))
> +                       continue;
> +
> +               r = dma_fence_add_callback(fence->parent, &fence->cb,
> +                                          drm_sched_process_job);
> +               if (r)
> +                       drm_sched_process_job(fence->parent, &fence->cb);
> +
> +already_signaled:
> +               ;
> +       }
> +       spin_unlock(&sched->job_list_lock);
>  }
>
>  /**
> --
> 2.14.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-10-09 16:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-09 11:19 [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Christian König
2018-10-09 11:19 ` [PATCH 2/2] drm/sched: fix timeout handling v2 Christian König
2018-10-09 16:25   ` Nayan Deshmukh
2018-10-09 16:25 ` [PATCH 1/2] drm/sched: add drm_sched_start_timeout helper Nayan Deshmukh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.