All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/sched: fix the bug of time out calculation(v3)
@ 2021-08-31 10:35 Monk Liu
  2021-08-31 10:35 ` [PATCH 2/2] drm/sched: serialize job_timeout and scheduler Monk Liu
  2021-09-01  0:24 ` [PATCH 1/2] drm/sched: fix the bug of time out calculation(v3) Liu, Monk
  0 siblings, 2 replies; 32+ messages in thread
From: Monk Liu @ 2021-08-31 10:35 UTC (permalink / raw)
  To: amd-gfx; +Cc: dri-devel, Monk Liu

issue:
in cleanup_job the cancle_delayed_work will cancel a TO timer
even the its corresponding job is still running.

fix:
do not cancel the timer in cleanup_job, instead do the cancelling
only when the heading job is signaled, and if there is a "next" job
we start_timeout again.

v2:
further cleanup the logic, and do the TDR timer cancelling if the signaled job
is the last one in its scheduler.

v3:
change the issue description
remove the cancel_delayed_work in the begining of the cleanup_job
recover the implement of drm_sched_job_begin.

TODO:
1)introduce pause/resume scheduler in job_timeout to serial the handling
of scheduler and job_timeout.
2)drop the bad job's del and insert in scheduler due to above serialization
(no race issue anymore with the serialization)

tested-by: jingwen <jingwen.chen@@amd.com>
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
---
 drivers/gpu/drm/scheduler/sched_main.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index a2a9536..ecf8140 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -676,13 +676,7 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
 {
 	struct drm_sched_job *job, *next;
 
-	/*
-	 * Don't destroy jobs while the timeout worker is running  OR thread
-	 * is being parked and hence assumed to not touch pending_list
-	 */
-	if ((sched->timeout != MAX_SCHEDULE_TIMEOUT &&
-	    !cancel_delayed_work(&sched->work_tdr)) ||
-	    kthread_should_park())
+	if (kthread_should_park())
 		return NULL;
 
 	spin_lock(&sched->job_list_lock);
@@ -693,17 +687,21 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
 	if (job && dma_fence_is_signaled(&job->s_fence->finished)) {
 		/* remove job from pending_list */
 		list_del_init(&job->list);
+
+		/* cancel this job's TO timer */
+		cancel_delayed_work(&sched->work_tdr);
 		/* make the scheduled timestamp more accurate */
 		next = list_first_entry_or_null(&sched->pending_list,
 						typeof(*next), list);
-		if (next)
+
+		if (next) {
 			next->s_fence->scheduled.timestamp =
 				job->s_fence->finished.timestamp;
-
+			/* start TO timer for next job */
+			drm_sched_start_timeout(sched);
+		}
 	} else {
 		job = NULL;
-		/* queue timeout for next job */
-		drm_sched_start_timeout(sched);
 	}
 
 	spin_unlock(&sched->job_list_lock);
@@ -791,11 +789,8 @@ static int drm_sched_main(void *param)
 					  (entity = drm_sched_select_entity(sched))) ||
 					 kthread_should_stop());
 
-		if (cleanup_job) {
+		if (cleanup_job)
 			sched->ops->free_job(cleanup_job);
-			/* queue timeout for next job */
-			drm_sched_start_timeout(sched);
-		}
 
 		if (!entity)
 			continue;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 32+ messages in thread
* [PATCH 1/2] drm/sched: fix the bug of time out calculation(v4)
@ 2021-09-01  0:46 Monk Liu
  2021-09-01  0:46 ` [PATCH 2/2] drm/sched: serialize job_timeout and scheduler Monk Liu
  0 siblings, 1 reply; 32+ messages in thread
From: Monk Liu @ 2021-09-01  0:46 UTC (permalink / raw)
  To: amd-gfx; +Cc: dri-devel, Monk Liu

issue:
in cleanup_job the cancle_delayed_work will cancel a TO timer
even the its corresponding job is still running.

fix:
do not cancel the timer in cleanup_job, instead do the cancelling
only when the heading job is signaled, and if there is a "next" job
we start_timeout again.

v2:
further cleanup the logic, and do the TDR timer cancelling if the signaled job
is the last one in its scheduler.

v3:
change the issue description
remove the cancel_delayed_work in the begining of the cleanup_job
recover the implement of drm_sched_job_begin.

v4:
remove the kthread_should_park() checking in cleanup_job routine,
we should cleanup the signaled job asap

TODO:
1)introduce pause/resume scheduler in job_timeout to serial the handling
of scheduler and job_timeout.
2)drop the bad job's del and insert in scheduler due to above serialization
(no race issue anymore with the serialization)

tested-by: jingwen <jingwen.chen@@amd.com>
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
---
 drivers/gpu/drm/scheduler/sched_main.c | 26 +++++++++-----------------
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index a2a9536..3e0bbc7 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -676,15 +676,6 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
 {
 	struct drm_sched_job *job, *next;
 
-	/*
-	 * Don't destroy jobs while the timeout worker is running  OR thread
-	 * is being parked and hence assumed to not touch pending_list
-	 */
-	if ((sched->timeout != MAX_SCHEDULE_TIMEOUT &&
-	    !cancel_delayed_work(&sched->work_tdr)) ||
-	    kthread_should_park())
-		return NULL;
-
 	spin_lock(&sched->job_list_lock);
 
 	job = list_first_entry_or_null(&sched->pending_list,
@@ -693,17 +684,21 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
 	if (job && dma_fence_is_signaled(&job->s_fence->finished)) {
 		/* remove job from pending_list */
 		list_del_init(&job->list);
+
+		/* cancel this job's TO timer */
+		cancel_delayed_work(&sched->work_tdr);
 		/* make the scheduled timestamp more accurate */
 		next = list_first_entry_or_null(&sched->pending_list,
 						typeof(*next), list);
-		if (next)
+
+		if (next) {
 			next->s_fence->scheduled.timestamp =
 				job->s_fence->finished.timestamp;
-
+			/* start TO timer for next job */
+			drm_sched_start_timeout(sched);
+		}
 	} else {
 		job = NULL;
-		/* queue timeout for next job */
-		drm_sched_start_timeout(sched);
 	}
 
 	spin_unlock(&sched->job_list_lock);
@@ -791,11 +786,8 @@ static int drm_sched_main(void *param)
 					  (entity = drm_sched_select_entity(sched))) ||
 					 kthread_should_stop());
 
-		if (cleanup_job) {
+		if (cleanup_job)
 			sched->ops->free_job(cleanup_job);
-			/* queue timeout for next job */
-			drm_sched_start_timeout(sched);
-		}
 
 		if (!entity)
 			continue;
-- 
2.7.4


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

end of thread, other threads:[~2021-11-11 15:54 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-31 10:35 [PATCH 1/2] drm/sched: fix the bug of time out calculation(v3) Monk Liu
2021-08-31 10:35 ` [PATCH 2/2] drm/sched: serialize job_timeout and scheduler Monk Liu
2021-08-31 12:59   ` Daniel Vetter
2021-08-31 13:01     ` Daniel Vetter
2021-09-01  0:56       ` Liu, Monk
2021-09-01  1:29       ` Liu, Monk
2021-11-08 23:39         ` Rob Clark
2021-11-08 23:39           ` Rob Clark
2021-11-09  9:07           ` Daniel Vetter
2021-11-09  9:07             ` Daniel Vetter
2021-11-09 16:17             ` Rob Clark
2021-11-10  9:50               ` Daniel Vetter
2021-11-10  9:50                 ` Daniel Vetter
2021-11-10 10:09                 ` Christian König
2021-11-10 12:50                   ` Andrey Grodzovsky
2021-11-10 13:24                   ` Daniel Vetter
2021-11-10 13:24                     ` Daniel Vetter
2021-11-11 15:54                     ` Andrey Grodzovsky
2021-11-10 19:15                 ` Rob Clark
2021-08-31 15:06     ` Luben Tuikov
2021-09-01  0:52     ` Liu, Monk
2021-08-31 13:53   ` Andrey Grodzovsky
2021-08-31 14:03     ` Daniel Vetter
2021-08-31 14:20       ` Andrey Grodzovsky
2021-08-31 14:38         ` Daniel Vetter
2021-08-31 15:23           ` Andrey Grodzovsky
2021-08-31 16:01             ` Luben Tuikov
2021-08-31 20:56               ` Andrey Grodzovsky
2021-08-31 21:24                 ` Luben Tuikov
2021-09-01  0:24 ` [PATCH 1/2] drm/sched: fix the bug of time out calculation(v3) Liu, Monk
2021-09-01  0:32   ` Grodzovsky, Andrey
2021-09-01  0:46 [PATCH 1/2] drm/sched: fix the bug of time out calculation(v4) Monk Liu
2021-09-01  0:46 ` [PATCH 2/2] drm/sched: serialize job_timeout and scheduler Monk Liu

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.