drm/amdgpu: fix lockup when clean pending fences
authorJunwei Zhang <Jerry.Zhang@amd.com>
Tue, 13 Oct 2015 03:14:23 +0000 (11:14 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 14 Oct 2015 20:20:32 +0000 (16:20 -0400)
The first lockup fence will lock the fence list of scheduler.
Then cancel the delayed workqueues for all clean pending fences
without waiting the workqueues to finish.

Change-Id: I9bec826de1aa49d587b0662f3fb4a95333979429
Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c

index a413dee7cd190d4c6ee43c59bf3342bb7a2544a2..7fa1d7a438e9c71ba76477f76d3f2d5379ca5955 100644 (file)
@@ -352,14 +352,14 @@ static void amd_sched_fence_work_func(struct work_struct *work)
        DRM_ERROR("[%s] scheduler is timeout!\n", sched->name);
 
        /* Clean all pending fences */
+       spin_lock_irqsave(&sched->fence_list_lock, flags);
        list_for_each_entry_safe(entity, tmp, &sched->fence_list, list) {
                DRM_ERROR("  fence no %d\n", entity->base.seqno);
-               cancel_delayed_work_sync(&entity->dwork);
-               spin_lock_irqsave(&sched->fence_list_lock, flags);
+               cancel_delayed_work(&entity->dwork);
                list_del_init(&entity->list);
-               spin_unlock_irqrestore(&sched->fence_list_lock, flags);
                fence_put(&entity->base);
        }
+       spin_unlock_irqrestore(&sched->fence_list_lock, flags);
 }
 
 static int amd_sched_main(void *param)