mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
drm/sched: Free all finished jobs at once
To implement fair scheduling we will need as accurate as possible view into per entity GPU time utilisation. Because sched fence execution time are only adjusted for accuracy in the free worker we need to process completed jobs as soon as possible so the metric is most up to date when view from the submission side of things. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com> Cc: Christian König <christian.koenig@amd.com> Cc: Danilo Krummrich <dakr@kernel.org> Cc: Matthew Brost <matthew.brost@intel.com> Cc: Philipp Stanner <phasta@kernel.org> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Acked-by: Danilo Krummrich <dakr@kernel.org> Tested-by: Vitaly Prosyak <vitaly.prosyak@amd.com> Signed-off-by: Philipp Stanner <phasta@kernel.org> Link: https://patch.msgid.link/20260417103744.76020-8-tvrtko.ursulin@igalia.com
This commit is contained in:
parent
94e1840400
commit
a58f317c1c
|
|
@ -910,7 +910,6 @@ drm_sched_select_entity(struct drm_gpu_scheduler *sched)
|
|||
* drm_sched_get_finished_job - fetch the next finished job to be destroyed
|
||||
*
|
||||
* @sched: scheduler instance
|
||||
* @have_more: are there more finished jobs on the list
|
||||
*
|
||||
* Informs the caller through @have_more whether there are more finished jobs
|
||||
* besides the returned one.
|
||||
|
|
@ -919,7 +918,7 @@ drm_sched_select_entity(struct drm_gpu_scheduler *sched)
|
|||
* ready for it to be destroyed.
|
||||
*/
|
||||
static struct drm_sched_job *
|
||||
drm_sched_get_finished_job(struct drm_gpu_scheduler *sched, bool *have_more)
|
||||
drm_sched_get_finished_job(struct drm_gpu_scheduler *sched)
|
||||
{
|
||||
struct drm_sched_job *job, *next;
|
||||
|
||||
|
|
@ -934,7 +933,6 @@ drm_sched_get_finished_job(struct drm_gpu_scheduler *sched, bool *have_more)
|
|||
/* cancel this job's TO timer */
|
||||
cancel_delayed_work(&sched->work_tdr);
|
||||
|
||||
*have_more = false;
|
||||
next = list_first_entry_or_null(&sched->pending_list,
|
||||
typeof(*next), list);
|
||||
if (next) {
|
||||
|
|
@ -944,8 +942,6 @@ drm_sched_get_finished_job(struct drm_gpu_scheduler *sched, bool *have_more)
|
|||
next->s_fence->scheduled.timestamp =
|
||||
dma_fence_timestamp(&job->s_fence->finished);
|
||||
|
||||
*have_more = dma_fence_is_signaled(&next->s_fence->finished);
|
||||
|
||||
/* start TO timer for next job */
|
||||
drm_sched_start_timeout(sched);
|
||||
}
|
||||
|
|
@ -1004,14 +1000,9 @@ static void drm_sched_free_job_work(struct work_struct *w)
|
|||
struct drm_gpu_scheduler *sched =
|
||||
container_of(w, struct drm_gpu_scheduler, work_free_job);
|
||||
struct drm_sched_job *job;
|
||||
bool have_more;
|
||||
|
||||
job = drm_sched_get_finished_job(sched, &have_more);
|
||||
if (job) {
|
||||
while ((job = drm_sched_get_finished_job(sched)))
|
||||
sched->ops->free_job(job);
|
||||
if (have_more)
|
||||
drm_sched_run_free_queue(sched);
|
||||
}
|
||||
|
||||
drm_sched_run_job_queue(sched);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user