diff options
| author | Christian König <christian.koenig@amd.com> | 2015-09-08 14:22:31 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2015-09-23 17:23:39 -0400 |
| commit | 4f839a243d3b0d8b1a14f4778a87ec4d8ddbf15f (patch) | |
| tree | 856d9a22af55ae4e8347c14c3d60cd235e79da72 /drivers/gpu/drm/amd | |
| parent | 5ec92a7692872d656cffe010920fb49c4f51d75f (diff) | |
drm/amdgpu: more scheduler cleanups v2
Embed the scheduler into the ring structure instead of allocating it.
Use the ring name directly instead of the id.
v2: rebased, whitespace cleanup
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Chunming Zhou<david1.zhou@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | 43 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 20 |
11 files changed, 87 insertions, 76 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 9108b7c7d4a3..57b427f958da 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -433,7 +433,7 @@ int amdgpu_fence_driver_init(struct amdgpu_device *adev); | |||
| 433 | void amdgpu_fence_driver_fini(struct amdgpu_device *adev); | 433 | void amdgpu_fence_driver_fini(struct amdgpu_device *adev); |
| 434 | void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); | 434 | void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); |
| 435 | 435 | ||
| 436 | void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); | 436 | int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); |
| 437 | int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, | 437 | int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, |
| 438 | struct amdgpu_irq_src *irq_src, | 438 | struct amdgpu_irq_src *irq_src, |
| 439 | unsigned irq_type); | 439 | unsigned irq_type); |
| @@ -891,7 +891,7 @@ struct amdgpu_ring { | |||
| 891 | struct amdgpu_device *adev; | 891 | struct amdgpu_device *adev; |
| 892 | const struct amdgpu_ring_funcs *funcs; | 892 | const struct amdgpu_ring_funcs *funcs; |
| 893 | struct amdgpu_fence_driver fence_drv; | 893 | struct amdgpu_fence_driver fence_drv; |
| 894 | struct amd_gpu_scheduler *sched; | 894 | struct amd_gpu_scheduler sched; |
| 895 | 895 | ||
| 896 | spinlock_t fence_lock; | 896 | spinlock_t fence_lock; |
| 897 | struct mutex *ring_lock; | 897 | struct mutex *ring_lock; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 6f39b2d2106d..b74b6a8e80a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
| @@ -848,7 +848,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 848 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 848 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
| 849 | if (!job) | 849 | if (!job) |
| 850 | return -ENOMEM; | 850 | return -ENOMEM; |
| 851 | job->base.sched = ring->sched; | 851 | job->base.sched = &ring->sched; |
| 852 | job->base.s_entity = &parser->ctx->rings[ring->idx].entity; | 852 | job->base.s_entity = &parser->ctx->rings[ring->idx].entity; |
| 853 | job->adev = parser->adev; | 853 | job->adev = parser->adev; |
| 854 | job->ibs = parser->ibs; | 854 | job->ibs = parser->ibs; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 5494831e1a24..e0b80ccdfe8a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |||
| @@ -43,10 +43,10 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel, | |||
| 43 | for (i = 0; i < adev->num_rings; i++) { | 43 | for (i = 0; i < adev->num_rings; i++) { |
| 44 | struct amd_sched_rq *rq; | 44 | struct amd_sched_rq *rq; |
| 45 | if (kernel) | 45 | if (kernel) |
| 46 | rq = &adev->rings[i]->sched->kernel_rq; | 46 | rq = &adev->rings[i]->sched.kernel_rq; |
| 47 | else | 47 | else |
| 48 | rq = &adev->rings[i]->sched->sched_rq; | 48 | rq = &adev->rings[i]->sched.sched_rq; |
| 49 | r = amd_sched_entity_init(adev->rings[i]->sched, | 49 | r = amd_sched_entity_init(&adev->rings[i]->sched, |
| 50 | &ctx->rings[i].entity, | 50 | &ctx->rings[i].entity, |
| 51 | rq, amdgpu_sched_jobs); | 51 | rq, amdgpu_sched_jobs); |
| 52 | if (r) | 52 | if (r) |
| @@ -55,7 +55,7 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel, | |||
| 55 | 55 | ||
| 56 | if (i < adev->num_rings) { | 56 | if (i < adev->num_rings) { |
| 57 | for (j = 0; j < i; j++) | 57 | for (j = 0; j < i; j++) |
| 58 | amd_sched_entity_fini(adev->rings[j]->sched, | 58 | amd_sched_entity_fini(&adev->rings[j]->sched, |
| 59 | &ctx->rings[j].entity); | 59 | &ctx->rings[j].entity); |
| 60 | kfree(ctx); | 60 | kfree(ctx); |
| 61 | return r; | 61 | return r; |
| @@ -75,7 +75,7 @@ void amdgpu_ctx_fini(struct amdgpu_ctx *ctx) | |||
| 75 | 75 | ||
| 76 | if (amdgpu_enable_scheduler) { | 76 | if (amdgpu_enable_scheduler) { |
| 77 | for (i = 0; i < adev->num_rings; i++) | 77 | for (i = 0; i < adev->num_rings; i++) |
| 78 | amd_sched_entity_fini(adev->rings[i]->sched, | 78 | amd_sched_entity_fini(&adev->rings[i]->sched, |
| 79 | &ctx->rings[i].entity); | 79 | &ctx->rings[i].entity); |
| 80 | } | 80 | } |
| 81 | } | 81 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 7f2d85e7e77a..b3fc26c59787 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | |||
| @@ -609,9 +609,9 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, | |||
| 609 | * Init the fence driver for the requested ring (all asics). | 609 | * Init the fence driver for the requested ring (all asics). |
| 610 | * Helper function for amdgpu_fence_driver_init(). | 610 | * Helper function for amdgpu_fence_driver_init(). |
| 611 | */ | 611 | */ |
| 612 | void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) | 612 | int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) |
| 613 | { | 613 | { |
| 614 | int i; | 614 | int i, r; |
| 615 | 615 | ||
| 616 | ring->fence_drv.cpu_addr = NULL; | 616 | ring->fence_drv.cpu_addr = NULL; |
| 617 | ring->fence_drv.gpu_addr = 0; | 617 | ring->fence_drv.gpu_addr = 0; |
| @@ -628,14 +628,16 @@ void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) | |||
| 628 | init_waitqueue_head(&ring->fence_drv.fence_queue); | 628 | init_waitqueue_head(&ring->fence_drv.fence_queue); |
| 629 | 629 | ||
| 630 | if (amdgpu_enable_scheduler) { | 630 | if (amdgpu_enable_scheduler) { |
| 631 | ring->sched = amd_sched_create(&amdgpu_sched_ops, | 631 | r = amd_sched_init(&ring->sched, &amdgpu_sched_ops, |
| 632 | ring->idx, | 632 | amdgpu_sched_hw_submission, ring->name); |
| 633 | amdgpu_sched_hw_submission, | 633 | if (r) { |
| 634 | (void *)ring->adev); | 634 | DRM_ERROR("Failed to create scheduler on ring %s.\n", |
| 635 | if (!ring->sched) | 635 | ring->name); |
| 636 | DRM_ERROR("Failed to create scheduler on ring %d.\n", | 636 | return r; |
| 637 | ring->idx); | 637 | } |
| 638 | } | 638 | } |
| 639 | |||
| 640 | return 0; | ||
| 639 | } | 641 | } |
| 640 | 642 | ||
| 641 | /** | 643 | /** |
| @@ -683,8 +685,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev) | |||
| 683 | wake_up_all(&ring->fence_drv.fence_queue); | 685 | wake_up_all(&ring->fence_drv.fence_queue); |
| 684 | amdgpu_irq_put(adev, ring->fence_drv.irq_src, | 686 | amdgpu_irq_put(adev, ring->fence_drv.irq_src, |
| 685 | ring->fence_drv.irq_type); | 687 | ring->fence_drv.irq_type); |
| 686 | if (ring->sched) | 688 | amd_sched_fini(&ring->sched); |
| 687 | amd_sched_destroy(ring->sched); | ||
| 688 | ring->fence_drv.initialized = false; | 689 | ring->fence_drv.initialized = false; |
| 689 | } | 690 | } |
| 690 | mutex_unlock(&adev->ring_lock); | 691 | mutex_unlock(&adev->ring_lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 6e735431676d..30dce235ddeb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |||
| @@ -357,7 +357,9 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, | |||
| 357 | ring->adev = adev; | 357 | ring->adev = adev; |
| 358 | ring->idx = adev->num_rings++; | 358 | ring->idx = adev->num_rings++; |
| 359 | adev->rings[ring->idx] = ring; | 359 | adev->rings[ring->idx] = ring; |
| 360 | amdgpu_fence_driver_init_ring(ring); | 360 | r = amdgpu_fence_driver_init_ring(ring); |
| 361 | if (r) | ||
| 362 | return r; | ||
| 361 | } | 363 | } |
| 362 | 364 | ||
| 363 | r = amdgpu_wb_get(adev, &ring->rptr_offs); | 365 | r = amdgpu_wb_get(adev, &ring->rptr_offs); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c index 7cf5405afe4e..e90712443fe9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | |||
| @@ -145,8 +145,13 @@ static uint32_t amdgpu_sa_get_ring_from_fence(struct fence *f) | |||
| 145 | struct amd_sched_fence *s_fence; | 145 | struct amd_sched_fence *s_fence; |
| 146 | 146 | ||
| 147 | s_fence = to_amd_sched_fence(f); | 147 | s_fence = to_amd_sched_fence(f); |
| 148 | if (s_fence) | 148 | if (s_fence) { |
| 149 | return s_fence->sched->ring_id; | 149 | struct amdgpu_ring *ring; |
| 150 | |||
| 151 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
| 152 | return ring->idx; | ||
| 153 | } | ||
| 154 | |||
| 150 | a_fence = to_amdgpu_fence(f); | 155 | a_fence = to_amdgpu_fence(f); |
| 151 | if (a_fence) | 156 | if (a_fence) |
| 152 | return a_fence->ring->idx; | 157 | return a_fence->ring->idx; |
| @@ -412,6 +417,26 @@ void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo, | |||
| 412 | } | 417 | } |
| 413 | 418 | ||
| 414 | #if defined(CONFIG_DEBUG_FS) | 419 | #if defined(CONFIG_DEBUG_FS) |
| 420 | |||
| 421 | static void amdgpu_sa_bo_dump_fence(struct fence *fence, struct seq_file *m) | ||
| 422 | { | ||
| 423 | struct amdgpu_fence *a_fence = to_amdgpu_fence(fence); | ||
| 424 | struct amd_sched_fence *s_fence = to_amd_sched_fence(fence); | ||
| 425 | |||
| 426 | if (a_fence) | ||
| 427 | seq_printf(m, " protected by 0x%016llx on ring %d", | ||
| 428 | a_fence->seq, a_fence->ring->idx); | ||
| 429 | |||
| 430 | if (s_fence) { | ||
| 431 | struct amdgpu_ring *ring; | ||
| 432 | |||
| 433 | |||
| 434 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
| 435 | seq_printf(m, " protected by 0x%016x on ring %d", | ||
| 436 | s_fence->base.seqno, ring->idx); | ||
| 437 | } | ||
| 438 | } | ||
| 439 | |||
| 415 | void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, | 440 | void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, |
| 416 | struct seq_file *m) | 441 | struct seq_file *m) |
| 417 | { | 442 | { |
| @@ -428,18 +453,8 @@ void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, | |||
| 428 | } | 453 | } |
| 429 | seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", | 454 | seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", |
| 430 | soffset, eoffset, eoffset - soffset); | 455 | soffset, eoffset, eoffset - soffset); |
| 431 | if (i->fence) { | 456 | if (i->fence) |
| 432 | struct amdgpu_fence *a_fence = to_amdgpu_fence(i->fence); | 457 | amdgpu_sa_bo_dump_fence(i->fence, m); |
| 433 | struct amd_sched_fence *s_fence = to_amd_sched_fence(i->fence); | ||
| 434 | if (a_fence) | ||
| 435 | seq_printf(m, " protected by 0x%016llx on ring %d", | ||
| 436 | a_fence->seq, a_fence->ring->idx); | ||
| 437 | if (s_fence) | ||
| 438 | seq_printf(m, " protected by 0x%016x on ring %d", | ||
| 439 | s_fence->base.seqno, | ||
| 440 | s_fence->sched->ring_id); | ||
| 441 | |||
| 442 | } | ||
| 443 | seq_printf(m, "\n"); | 458 | seq_printf(m, "\n"); |
| 444 | } | 459 | } |
| 445 | spin_unlock(&sa_manager->wq.lock); | 460 | spin_unlock(&sa_manager->wq.lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index d1984fc5dfc4..2e946b2cad88 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
| @@ -85,7 +85,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
| 85 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 85 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
| 86 | if (!job) | 86 | if (!job) |
| 87 | return -ENOMEM; | 87 | return -ENOMEM; |
| 88 | job->base.sched = ring->sched; | 88 | job->base.sched = &ring->sched; |
| 89 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; | 89 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; |
| 90 | job->adev = adev; | 90 | job->adev = adev; |
| 91 | job->ibs = ibs; | 91 | job->ibs = ibs; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index b57ca10a8533..4921de15b451 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | |||
| @@ -65,8 +65,14 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, struct fence *f) | |||
| 65 | 65 | ||
| 66 | if (a_fence) | 66 | if (a_fence) |
| 67 | return a_fence->ring->adev == adev; | 67 | return a_fence->ring->adev == adev; |
| 68 | if (s_fence) | 68 | |
| 69 | return (struct amdgpu_device *)s_fence->sched->priv == adev; | 69 | if (s_fence) { |
| 70 | struct amdgpu_ring *ring; | ||
| 71 | |||
| 72 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
| 73 | return ring->adev == adev; | ||
| 74 | } | ||
| 75 | |||
| 70 | return false; | 76 | return false; |
| 71 | } | 77 | } |
| 72 | 78 | ||
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h b/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h index a1f4ece58a24..144f50acc971 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h | |||
| @@ -16,21 +16,21 @@ TRACE_EVENT(amd_sched_job, | |||
| 16 | TP_ARGS(sched_job), | 16 | TP_ARGS(sched_job), |
| 17 | TP_STRUCT__entry( | 17 | TP_STRUCT__entry( |
| 18 | __field(struct amd_sched_entity *, entity) | 18 | __field(struct amd_sched_entity *, entity) |
| 19 | __field(u32, ring_id) | 19 | __field(const char *, name) |
| 20 | __field(u32, job_count) | 20 | __field(u32, job_count) |
| 21 | __field(int, hw_job_count) | 21 | __field(int, hw_job_count) |
| 22 | ), | 22 | ), |
| 23 | 23 | ||
| 24 | TP_fast_assign( | 24 | TP_fast_assign( |
| 25 | __entry->entity = sched_job->s_entity; | 25 | __entry->entity = sched_job->s_entity; |
| 26 | __entry->ring_id = sched_job->sched->ring_id; | 26 | __entry->name = sched_job->sched->name; |
| 27 | __entry->job_count = kfifo_len( | 27 | __entry->job_count = kfifo_len( |
| 28 | &sched_job->s_entity->job_queue) / sizeof(sched_job); | 28 | &sched_job->s_entity->job_queue) / sizeof(sched_job); |
| 29 | __entry->hw_job_count = atomic_read( | 29 | __entry->hw_job_count = atomic_read( |
| 30 | &sched_job->sched->hw_rq_count); | 30 | &sched_job->sched->hw_rq_count); |
| 31 | ), | 31 | ), |
| 32 | TP_printk("entity=%p, ring=%u, job count:%u, hw job count:%d", | 32 | TP_printk("entity=%p, ring=%s, job count:%u, hw job count:%d", |
| 33 | __entry->entity, __entry->ring_id, __entry->job_count, | 33 | __entry->entity, __entry->name, __entry->job_count, |
| 34 | __entry->hw_job_count) | 34 | __entry->hw_job_count) |
| 35 | ); | 35 | ); |
| 36 | #endif | 36 | #endif |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index ec4842e58fd7..3697eeeecf82 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
| @@ -381,56 +381,45 @@ static int amd_sched_main(void *param) | |||
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | /** | 383 | /** |
| 384 | * Create a gpu scheduler | 384 | * Init a gpu scheduler instance |
| 385 | * | 385 | * |
| 386 | * @sched The pointer to the scheduler | ||
| 386 | * @ops The backend operations for this scheduler. | 387 | * @ops The backend operations for this scheduler. |
| 387 | * @ring The the ring id for the scheduler. | ||
| 388 | * @hw_submissions Number of hw submissions to do. | 388 | * @hw_submissions Number of hw submissions to do. |
| 389 | * @name Name used for debugging | ||
| 389 | * | 390 | * |
| 390 | * Return the pointer to scheduler for success, otherwise return NULL | 391 | * Return 0 on success, otherwise error code. |
| 391 | */ | 392 | */ |
| 392 | struct amd_gpu_scheduler *amd_sched_create(struct amd_sched_backend_ops *ops, | 393 | int amd_sched_init(struct amd_gpu_scheduler *sched, |
| 393 | unsigned ring, unsigned hw_submission, | 394 | struct amd_sched_backend_ops *ops, |
| 394 | void *priv) | 395 | unsigned hw_submission, const char *name) |
| 395 | { | 396 | { |
| 396 | struct amd_gpu_scheduler *sched; | ||
| 397 | |||
| 398 | sched = kzalloc(sizeof(struct amd_gpu_scheduler), GFP_KERNEL); | ||
| 399 | if (!sched) | ||
| 400 | return NULL; | ||
| 401 | |||
| 402 | sched->ops = ops; | 397 | sched->ops = ops; |
| 403 | sched->ring_id = ring; | ||
| 404 | sched->hw_submission_limit = hw_submission; | 398 | sched->hw_submission_limit = hw_submission; |
| 405 | sched->priv = priv; | 399 | sched->name = name; |
| 406 | snprintf(sched->name, sizeof(sched->name), "amdgpu[%d]", ring); | ||
| 407 | amd_sched_rq_init(&sched->sched_rq); | 400 | amd_sched_rq_init(&sched->sched_rq); |
| 408 | amd_sched_rq_init(&sched->kernel_rq); | 401 | amd_sched_rq_init(&sched->kernel_rq); |
| 409 | 402 | ||
| 410 | init_waitqueue_head(&sched->wake_up_worker); | 403 | init_waitqueue_head(&sched->wake_up_worker); |
| 411 | init_waitqueue_head(&sched->job_scheduled); | 404 | init_waitqueue_head(&sched->job_scheduled); |
| 412 | atomic_set(&sched->hw_rq_count, 0); | 405 | atomic_set(&sched->hw_rq_count, 0); |
| 406 | |||
| 413 | /* Each scheduler will run on a seperate kernel thread */ | 407 | /* Each scheduler will run on a seperate kernel thread */ |
| 414 | sched->thread = kthread_run(amd_sched_main, sched, sched->name); | 408 | sched->thread = kthread_run(amd_sched_main, sched, sched->name); |
| 415 | if (IS_ERR(sched->thread)) { | 409 | if (IS_ERR(sched->thread)) { |
| 416 | DRM_ERROR("Failed to create scheduler for id %d.\n", ring); | 410 | DRM_ERROR("Failed to create scheduler for %s.\n", name); |
| 417 | kfree(sched); | 411 | return PTR_ERR(sched->thread); |
| 418 | return NULL; | ||
| 419 | } | 412 | } |
| 420 | 413 | ||
| 421 | return sched; | 414 | return 0; |
| 422 | } | 415 | } |
| 423 | 416 | ||
| 424 | /** | 417 | /** |
| 425 | * Destroy a gpu scheduler | 418 | * Destroy a gpu scheduler |
| 426 | * | 419 | * |
| 427 | * @sched The pointer to the scheduler | 420 | * @sched The pointer to the scheduler |
| 428 | * | ||
| 429 | * return 0 if succeed. -1 if failed. | ||
| 430 | */ | 421 | */ |
| 431 | int amd_sched_destroy(struct amd_gpu_scheduler *sched) | 422 | void amd_sched_fini(struct amd_gpu_scheduler *sched) |
| 432 | { | 423 | { |
| 433 | kthread_stop(sched->thread); | 424 | kthread_stop(sched->thread); |
| 434 | kfree(sched); | ||
| 435 | return 0; | ||
| 436 | } | 425 | } |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h index 89d977dd30ac..80b64dc22214 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | |||
| @@ -101,23 +101,21 @@ struct amd_sched_backend_ops { | |||
| 101 | * One scheduler is implemented for each hardware ring | 101 | * One scheduler is implemented for each hardware ring |
| 102 | */ | 102 | */ |
| 103 | struct amd_gpu_scheduler { | 103 | struct amd_gpu_scheduler { |
| 104 | struct task_struct *thread; | 104 | struct amd_sched_backend_ops *ops; |
| 105 | uint32_t hw_submission_limit; | ||
| 106 | const char *name; | ||
| 105 | struct amd_sched_rq sched_rq; | 107 | struct amd_sched_rq sched_rq; |
| 106 | struct amd_sched_rq kernel_rq; | 108 | struct amd_sched_rq kernel_rq; |
| 107 | atomic_t hw_rq_count; | ||
| 108 | struct amd_sched_backend_ops *ops; | ||
| 109 | uint32_t ring_id; | ||
| 110 | wait_queue_head_t wake_up_worker; | 109 | wait_queue_head_t wake_up_worker; |
| 111 | wait_queue_head_t job_scheduled; | 110 | wait_queue_head_t job_scheduled; |
| 112 | uint32_t hw_submission_limit; | 111 | atomic_t hw_rq_count; |
| 113 | char name[20]; | 112 | struct task_struct *thread; |
| 114 | void *priv; | ||
| 115 | }; | 113 | }; |
| 116 | 114 | ||
| 117 | struct amd_gpu_scheduler * | 115 | int amd_sched_init(struct amd_gpu_scheduler *sched, |
| 118 | amd_sched_create(struct amd_sched_backend_ops *ops, | 116 | struct amd_sched_backend_ops *ops, |
| 119 | uint32_t ring, uint32_t hw_submission, void *priv); | 117 | uint32_t hw_submission, const char *name); |
| 120 | int amd_sched_destroy(struct amd_gpu_scheduler *sched); | 118 | void amd_sched_fini(struct amd_gpu_scheduler *sched); |
| 121 | 119 | ||
| 122 | int amd_sched_entity_init(struct amd_gpu_scheduler *sched, | 120 | int amd_sched_entity_init(struct amd_gpu_scheduler *sched, |
| 123 | struct amd_sched_entity *entity, | 121 | struct amd_sched_entity *entity, |
