diff options
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 4 |
2 files changed, 1 insertions, 42 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index af846f208c67..9a9fffdc272b 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
@@ -418,46 +418,18 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb) | |||
418 | spin_unlock_irqrestore(&sched->job_list_lock, flags); | 418 | spin_unlock_irqrestore(&sched->job_list_lock, flags); |
419 | 419 | ||
420 | amd_sched_fence_signal(s_fence); | 420 | amd_sched_fence_signal(s_fence); |
421 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT) { | 421 | |
422 | cancel_delayed_work(&s_fence->dwork); | ||
423 | spin_lock_irqsave(&sched->fence_list_lock, flags); | ||
424 | list_del_init(&s_fence->list); | ||
425 | spin_unlock_irqrestore(&sched->fence_list_lock, flags); | ||
426 | } | ||
427 | trace_amd_sched_process_job(s_fence); | 422 | trace_amd_sched_process_job(s_fence); |
428 | fence_put(&s_fence->base); | 423 | fence_put(&s_fence->base); |
429 | wake_up_interruptible(&sched->wake_up_worker); | 424 | wake_up_interruptible(&sched->wake_up_worker); |
430 | } | 425 | } |
431 | 426 | ||
432 | static void amd_sched_fence_work_func(struct work_struct *work) | ||
433 | { | ||
434 | struct amd_sched_fence *s_fence = | ||
435 | container_of(work, struct amd_sched_fence, dwork.work); | ||
436 | struct amd_gpu_scheduler *sched = s_fence->sched; | ||
437 | struct amd_sched_fence *entity, *tmp; | ||
438 | unsigned long flags; | ||
439 | |||
440 | DRM_ERROR("[%s] scheduler is timeout!\n", sched->name); | ||
441 | |||
442 | /* Clean all pending fences */ | ||
443 | spin_lock_irqsave(&sched->fence_list_lock, flags); | ||
444 | list_for_each_entry_safe(entity, tmp, &sched->fence_list, list) { | ||
445 | DRM_ERROR(" fence no %d\n", entity->base.seqno); | ||
446 | cancel_delayed_work(&entity->dwork); | ||
447 | list_del_init(&entity->list); | ||
448 | fence_put(&entity->base); | ||
449 | } | ||
450 | spin_unlock_irqrestore(&sched->fence_list_lock, flags); | ||
451 | } | ||
452 | |||
453 | static int amd_sched_main(void *param) | 427 | static int amd_sched_main(void *param) |
454 | { | 428 | { |
455 | struct sched_param sparam = {.sched_priority = 1}; | 429 | struct sched_param sparam = {.sched_priority = 1}; |
456 | struct amd_gpu_scheduler *sched = (struct amd_gpu_scheduler *)param; | 430 | struct amd_gpu_scheduler *sched = (struct amd_gpu_scheduler *)param; |
457 | int r, count; | 431 | int r, count; |
458 | 432 | ||
459 | spin_lock_init(&sched->fence_list_lock); | ||
460 | INIT_LIST_HEAD(&sched->fence_list); | ||
461 | sched_setscheduler(current, SCHED_FIFO, &sparam); | 433 | sched_setscheduler(current, SCHED_FIFO, &sparam); |
462 | 434 | ||
463 | while (!kthread_should_stop()) { | 435 | while (!kthread_should_stop()) { |
@@ -465,7 +437,6 @@ static int amd_sched_main(void *param) | |||
465 | struct amd_sched_fence *s_fence; | 437 | struct amd_sched_fence *s_fence; |
466 | struct amd_sched_job *sched_job; | 438 | struct amd_sched_job *sched_job; |
467 | struct fence *fence; | 439 | struct fence *fence; |
468 | unsigned long flags; | ||
469 | 440 | ||
470 | wait_event_interruptible(sched->wake_up_worker, | 441 | wait_event_interruptible(sched->wake_up_worker, |
471 | (entity = amd_sched_select_entity(sched)) || | 442 | (entity = amd_sched_select_entity(sched)) || |
@@ -480,14 +451,6 @@ static int amd_sched_main(void *param) | |||
480 | 451 | ||
481 | s_fence = sched_job->s_fence; | 452 | s_fence = sched_job->s_fence; |
482 | 453 | ||
483 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT) { | ||
484 | INIT_DELAYED_WORK(&s_fence->dwork, amd_sched_fence_work_func); | ||
485 | schedule_delayed_work(&s_fence->dwork, sched->timeout); | ||
486 | spin_lock_irqsave(&sched->fence_list_lock, flags); | ||
487 | list_add_tail(&s_fence->list, &sched->fence_list); | ||
488 | spin_unlock_irqrestore(&sched->fence_list_lock, flags); | ||
489 | } | ||
490 | |||
491 | atomic_inc(&sched->hw_rq_count); | 454 | atomic_inc(&sched->hw_rq_count); |
492 | amd_sched_job_pre_schedule(sched, sched_job); | 455 | amd_sched_job_pre_schedule(sched, sched_job); |
493 | fence = sched->ops->run_job(sched_job); | 456 | fence = sched->ops->run_job(sched_job); |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h index 2e3b8308186c..b26148d24a3d 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | |||
@@ -74,8 +74,6 @@ struct amd_sched_fence { | |||
74 | struct amd_gpu_scheduler *sched; | 74 | struct amd_gpu_scheduler *sched; |
75 | spinlock_t lock; | 75 | spinlock_t lock; |
76 | void *owner; | 76 | void *owner; |
77 | struct delayed_work dwork; | ||
78 | struct list_head list; | ||
79 | struct amd_sched_job *s_job; | 77 | struct amd_sched_job *s_job; |
80 | }; | 78 | }; |
81 | 79 | ||
@@ -127,8 +125,6 @@ struct amd_gpu_scheduler { | |||
127 | wait_queue_head_t wake_up_worker; | 125 | wait_queue_head_t wake_up_worker; |
128 | wait_queue_head_t job_scheduled; | 126 | wait_queue_head_t job_scheduled; |
129 | atomic_t hw_rq_count; | 127 | atomic_t hw_rq_count; |
130 | struct list_head fence_list; | ||
131 | spinlock_t fence_list_lock; | ||
132 | struct task_struct *thread; | 128 | struct task_struct *thread; |
133 | struct list_head ring_mirror_list; | 129 | struct list_head ring_mirror_list; |
134 | spinlock_t job_list_lock; | 130 | spinlock_t job_list_lock; |