Hi Donald, On Thu, 8 Jun 2023 13:23:26 +0000 Donald Robson <Donald.Robson@xxxxxxxxxx> wrote: > /** > * drm_sched_job_arm - arm a scheduler job for execution > * @job: scheduler job to arm > @@ -669,6 +755,7 @@ void drm_sched_job_arm(struct drm_sched_job *job) > job->s_priority = entity->rq - sched->sched_rq; > job->id = atomic64_inc_return(&sched->job_id_count); > > + drm_sched_sort_native_deps(job); If we get [1] accepted, we no longer need to sort the array. We can just skip native dependencies as we iterate over the array in drm_sched_job_dependency() with something like: f = xa_load(&job->dependencies, job->last_dependency); while (f) { struct drm_sched_fence *s_fence; struct dma_fence *scheduled_fence; job->last_dependency++; /* Not a native dependency, return the fence directly. */ if (!job->sched->ops->dependency_is_native || !job->sched->ops->dependency_is_native(f)) return dma_fence_get(f); /* * If the native fence is a drm_sched_fence object, we * ensure the job has been submitted so drm_sched_fence * ::parent points to a valid dma_fence object. */ s_fence = to_drm_sched_fence(f); scheduled_fence = s_fence ? dma_fence_get_rcu(&s_fence->scheduled) : NULL; if (scheduled_fence) return scheduled_fence; /* Otherwise we skip the native fence and check the next fence. */ f = xa_load(&job->dependencies, job->last_dependency); } And, in the driver, when you get to submit the job, you can gather the native deps with a simple xa_for_each() loop: xa_for_each(&job->dependencies, index, f) { /* If the fence is not signaled, it must be a native fence, * because drm_sched_entity waited for all non-native ones. */ if (!dma_fence_is_signaled(f)) // DO SOMETHING } > drm_sched_fence_init(job->s_fence, job->entity); > } Regards, Boris [1]https://patchwork.freedesktop.org/patch/541956/