Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/lima: use scheduler dependency tracking

Nothing special going on here.

Aside reviewing the code, it seems like drm_sched_job_arm() should be
moved into lima_sched_context_queue_task and put under some mutex
together with drm_sched_push_job(). See the kerneldoc for
drm_sched_push_job().

v2: Rebase over renamed functions to add dependencies.

Reviewed-by: Qiang Yu <yuq825@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Qiang Yu <yuq825@gmail.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: lima@lists.freedesktop.org
Cc: linux-media@vger.kernel.org
Cc: linaro-mm-sig@lists.linaro.org
Link: https://patchwork.freedesktop.org/patch/msgid/20210805104705.862416-9-daniel.vetter@ffwll.ch

+4 -26
+4 -2
drivers/gpu/drm/lima/lima_gem.c
··· 267 267 if (explicit) 268 268 return 0; 269 269 270 - return drm_gem_fence_array_add_implicit(&task->deps, &bo->base.base, write); 270 + return drm_sched_job_add_implicit_dependencies(&task->base, 271 + &bo->base.base, 272 + write); 271 273 } 272 274 273 275 static int lima_gem_add_deps(struct drm_file *file, struct lima_submit *submit) ··· 287 285 if (err) 288 286 return err; 289 287 290 - err = drm_gem_fence_array_add(&submit->task->deps, fence); 288 + err = drm_sched_job_add_dependency(&submit->task->base, fence); 291 289 if (err) { 292 290 dma_fence_put(fence); 293 291 return err;
-21
drivers/gpu/drm/lima/lima_sched.c
··· 134 134 task->num_bos = num_bos; 135 135 task->vm = lima_vm_get(vm); 136 136 137 - xa_init_flags(&task->deps, XA_FLAGS_ALLOC); 138 - 139 137 return 0; 140 138 } 141 139 142 140 void lima_sched_task_fini(struct lima_sched_task *task) 143 141 { 144 - struct dma_fence *fence; 145 - unsigned long index; 146 142 int i; 147 143 148 144 drm_sched_job_cleanup(&task->base); 149 - 150 - xa_for_each(&task->deps, index, fence) { 151 - dma_fence_put(fence); 152 - } 153 - xa_destroy(&task->deps); 154 145 155 146 if (task->bos) { 156 147 for (i = 0; i < task->num_bos; i++) ··· 175 184 trace_lima_task_submit(task); 176 185 drm_sched_entity_push_job(&task->base); 177 186 return fence; 178 - } 179 - 180 - static struct dma_fence *lima_sched_dependency(struct drm_sched_job *job, 181 - struct drm_sched_entity *entity) 182 - { 183 - struct lima_sched_task *task = to_lima_task(job); 184 - 185 - if (!xa_empty(&task->deps)) 186 - return xa_erase(&task->deps, task->last_dep++); 187 - 188 - return NULL; 189 187 } 190 188 191 189 static int lima_pm_busy(struct lima_device *ldev) ··· 452 472 } 453 473 454 474 static const struct drm_sched_backend_ops lima_sched_ops = { 455 - .dependency = lima_sched_dependency, 456 475 .run_job = lima_sched_run_job, 457 476 .timedout_job = lima_sched_timedout_job, 458 477 .free_job = lima_sched_free_job,
-3
drivers/gpu/drm/lima/lima_sched.h
··· 23 23 struct lima_vm *vm; 24 24 void *frame; 25 25 26 - struct xarray deps; 27 - unsigned long last_dep; 28 - 29 26 struct lima_bo **bos; 30 27 int num_bos; 31 28