From d4671ce3c3b18c369b512cd692aec3769f37e11a Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Thu, 26 Aug 2021 16:08:01 -0400 Subject: drm/sched: Add TTL per job for timeout handling. Signed-off-by: Andrey Grodzovsky --- drivers/gpu/drm/scheduler/sched_main.c | 16 ++++++++++++++-- include/drm/gpu_scheduler.h | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c index ecf8140f6968..c8e31515803c 100644 --- a/drivers/gpu/drm/scheduler/sched_main.c +++ b/drivers/gpu/drm/scheduler/sched_main.c @@ -306,6 +306,7 @@ static void drm_sched_job_begin(struct drm_sched_job *s_job) spin_lock(&sched->job_list_lock); list_add_tail(&s_job->list, &sched->pending_list); + s_job->ts = get_jiffies_64(); drm_sched_start_timeout(sched); spin_unlock(&sched->job_list_lock); } @@ -695,10 +696,21 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched) typeof(*next), list); if (next) { + uint64_t ttl; + next->s_fence->scheduled.timestamp = job->s_fence->finished.timestamp; - /* start TO timer for next job */ - drm_sched_start_timeout(sched); + + /* + * Make precise calculation how much time should be + * left for the next job before reaming timer. In case + * it's TTL expired scheduler TO handler right away. + */ + ttl = get_jiffies_64() - job->ts; + if (likely(ttl < sched->timeout)) + mod_delayed_work(system_wq, &sched->work_tdr, ttl); + else + mod_delayed_work(system_wq, &sched->work_tdr, 0); } } else { job = NULL; diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h index d18af49fd009..80cc23e799cf 100644 --- a/include/drm/gpu_scheduler.h +++ b/include/drm/gpu_scheduler.h @@ -182,6 +182,7 @@ struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f); * @s_priority: the priority of the job. * @entity: the entity to which this job belongs. * @cb: the callback for the parent fence in s_fence. + * @ts: ts to messure for how long the job been running in jiffies * * A job is created by the driver using drm_sched_job_init(), and * should call drm_sched_entity_push_job() once it wants the scheduler @@ -198,6 +199,7 @@ struct drm_sched_job { enum drm_sched_priority s_priority; struct drm_sched_entity *entity; struct dma_fence_cb cb; + uint64_t ts; }; static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job, -- 2.25.1