70 lines
2.6 KiB
Diff
70 lines
2.6 KiB
Diff
From f3123c2590005c5ff631653d31428e40cd10c618 Mon Sep 17 00:00:00 2001
|
|
From: Luben Tuikov <ltuikov89@gmail.com>
|
|
Date: Thu, 9 Nov 2023 18:53:26 -0500
|
|
Subject: [PATCH] drm/sched: Qualify drm_sched_wakeup() by
|
|
drm_sched_entity_is_ready()
|
|
|
|
Don't "wake up" the GPU scheduler unless the entity is ready, as well as we
|
|
can queue to the scheduler, i.e. there is no point in waking up the scheduler
|
|
for the entity unless the entity is ready.
|
|
|
|
Signed-off-by: Luben Tuikov <ltuikov89@gmail.com>
|
|
Fixes: bc8d6a9df99038 ("drm/sched: Don't disturb the entity when in RR-mode scheduling")
|
|
Reviewed-by: Danilo Krummrich <dakr@redhat.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20231110000123.72565-2-ltuikov89@gmail.com
|
|
---
|
|
drivers/gpu/drm/scheduler/sched_entity.c | 4 ++--
|
|
drivers/gpu/drm/scheduler/sched_main.c | 8 +++++---
|
|
include/drm/gpu_scheduler.h | 2 +-
|
|
3 files changed, 8 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/scheduler/sched_entity.c
|
|
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
|
|
@@ -372,7 +372,7 @@ static void drm_sched_entity_wakeup(stru
|
|
container_of(cb, struct drm_sched_entity, cb);
|
|
|
|
drm_sched_entity_clear_dep(f, cb);
|
|
- drm_sched_wakeup(entity->rq->sched);
|
|
+ drm_sched_wakeup(entity->rq->sched, entity);
|
|
}
|
|
|
|
/**
|
|
@@ -604,7 +604,7 @@ void drm_sched_entity_push_job(struct dr
|
|
if (drm_sched_policy == DRM_SCHED_POLICY_FIFO)
|
|
drm_sched_rq_update_fifo(entity, submit_ts);
|
|
|
|
- drm_sched_wakeup(entity->rq->sched);
|
|
+ drm_sched_wakeup(entity->rq->sched, entity);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_sched_entity_push_job);
|
|
--- a/drivers/gpu/drm/scheduler/sched_main.c
|
|
+++ b/drivers/gpu/drm/scheduler/sched_main.c
|
|
@@ -922,10 +922,12 @@ static bool drm_sched_can_queue(struct d
|
|
*
|
|
* Wake up the scheduler if we can queue jobs.
|
|
*/
|
|
-void drm_sched_wakeup(struct drm_gpu_scheduler *sched)
|
|
+void drm_sched_wakeup(struct drm_gpu_scheduler *sched,
|
|
+ struct drm_sched_entity *entity)
|
|
{
|
|
- if (drm_sched_can_queue(sched))
|
|
- drm_sched_run_job_queue(sched);
|
|
+ if (drm_sched_entity_is_ready(entity))
|
|
+ if (drm_sched_can_queue(sched))
|
|
+ drm_sched_run_job_queue(sched);
|
|
}
|
|
|
|
/**
|
|
--- a/include/drm/gpu_scheduler.h
|
|
+++ b/include/drm/gpu_scheduler.h
|
|
@@ -558,7 +558,7 @@ void drm_sched_entity_modify_sched(struc
|
|
|
|
void drm_sched_tdr_queue_imm(struct drm_gpu_scheduler *sched);
|
|
void drm_sched_job_cleanup(struct drm_sched_job *job);
|
|
-void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
|
|
+void drm_sched_wakeup(struct drm_gpu_scheduler *sched, struct drm_sched_entity *entity);
|
|
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched);
|
|
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched);
|
|
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched);
|