aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2016-03-04 01:42:26 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-05-02 15:19:42 -0400
commitcccd9bce978a6644bae75304a05db4faa36faec7 (patch)
tree462a9d2edf302026416345c40cd61ce16960478c
parent4835096b07420c1d74cc5711c461830016e6cb03 (diff)
drm/amdgpu: get rid of incorrect TDR
original time out detect routine is incorrect, cuz it measures the gap from job scheduled, but we should only measure the gap from processed by hw. Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c39
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.h4
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
432static 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
453static int amd_sched_main(void *param) 427static 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;