|
11 | 11 | #include "nouveau_exec.h" |
12 | 12 | #include "nouveau_abi16.h" |
13 | 13 | #include "nouveau_sched.h" |
14 | | -#include "nouveau_chan.h" |
15 | 14 |
|
16 | 15 | #define NOUVEAU_SCHED_JOB_TIMEOUT_MS 10000 |
17 | 16 |
|
@@ -122,9 +121,11 @@ nouveau_job_done(struct nouveau_job *job) |
122 | 121 | { |
123 | 122 | struct nouveau_sched *sched = job->sched; |
124 | 123 |
|
125 | | - spin_lock(&sched->job_list.lock); |
| 124 | + spin_lock(&sched->job.list.lock); |
126 | 125 | list_del(&job->entry); |
127 | | - spin_unlock(&sched->job_list.lock); |
| 126 | + spin_unlock(&sched->job.list.lock); |
| 127 | + |
| 128 | + wake_up(&sched->job.wq); |
128 | 129 | } |
129 | 130 |
|
130 | 131 | void |
@@ -305,9 +306,9 @@ nouveau_job_submit(struct nouveau_job *job) |
305 | 306 | } |
306 | 307 |
|
307 | 308 | /* Submit was successful; add the job to the schedulers job list. */ |
308 | | - spin_lock(&sched->job_list.lock); |
309 | | - list_add(&job->entry, &sched->job_list.head); |
310 | | - spin_unlock(&sched->job_list.lock); |
| 309 | + spin_lock(&sched->job.list.lock); |
| 310 | + list_add(&job->entry, &sched->job.list.head); |
| 311 | + spin_unlock(&sched->job.list.lock); |
311 | 312 |
|
312 | 313 | drm_sched_job_arm(&job->base); |
313 | 314 | job->done_fence = dma_fence_get(&job->base.s_fence->finished); |
@@ -392,23 +393,10 @@ nouveau_sched_free_job(struct drm_sched_job *sched_job) |
392 | 393 | nouveau_job_fini(job); |
393 | 394 | } |
394 | 395 |
|
395 | | -static void |
396 | | -nouveau_sched_cancel_job(struct drm_sched_job *sched_job) |
397 | | -{ |
398 | | - struct nouveau_fence *fence; |
399 | | - struct nouveau_job *job; |
400 | | - |
401 | | - job = to_nouveau_job(sched_job); |
402 | | - fence = to_nouveau_fence(job->done_fence); |
403 | | - |
404 | | - nouveau_fence_cancel(fence); |
405 | | -} |
406 | | - |
407 | 396 | static const struct drm_sched_backend_ops nouveau_sched_ops = { |
408 | 397 | .run_job = nouveau_sched_run_job, |
409 | 398 | .timedout_job = nouveau_sched_timedout_job, |
410 | 399 | .free_job = nouveau_sched_free_job, |
411 | | - .cancel_job = nouveau_sched_cancel_job, |
412 | 400 | }; |
413 | 401 |
|
414 | 402 | static int |
@@ -458,8 +446,9 @@ nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm, |
458 | 446 | goto fail_sched; |
459 | 447 |
|
460 | 448 | mutex_init(&sched->mutex); |
461 | | - spin_lock_init(&sched->job_list.lock); |
462 | | - INIT_LIST_HEAD(&sched->job_list.head); |
| 449 | + spin_lock_init(&sched->job.list.lock); |
| 450 | + INIT_LIST_HEAD(&sched->job.list.head); |
| 451 | + init_waitqueue_head(&sched->job.wq); |
463 | 452 |
|
464 | 453 | return 0; |
465 | 454 |
|
@@ -493,12 +482,16 @@ nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm, |
493 | 482 | return 0; |
494 | 483 | } |
495 | 484 |
|
| 485 | + |
496 | 486 | static void |
497 | 487 | nouveau_sched_fini(struct nouveau_sched *sched) |
498 | 488 | { |
499 | 489 | struct drm_gpu_scheduler *drm_sched = &sched->base; |
500 | 490 | struct drm_sched_entity *entity = &sched->entity; |
501 | 491 |
|
| 492 | + rmb(); /* for list_empty to work without lock */ |
| 493 | + wait_event(sched->job.wq, list_empty(&sched->job.list.head)); |
| 494 | + |
502 | 495 | drm_sched_entity_fini(entity); |
503 | 496 | drm_sched_fini(drm_sched); |
504 | 497 |
|
|
0 commit comments