drm/amdgpu: fix lockup when clean pending fences

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>
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index a413dee..7fa1d7a 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -352,14 +352,14 @@
 	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)