drm/amdgpu: remove entity idle timeout v2
authorChristian König <christian.koenig@amd.com>
Fri, 21 Aug 2015 13:46:43 +0000 (15:46 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 26 Aug 2015 21:52:18 +0000 (17:52 -0400)
Removing the entity from scheduling can deadlock the whole system.
Wait forever till the remaining IBs are scheduled.

v2: fix comment as well

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com> (v1)
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
drivers/gpu/drm/amd/scheduler/gpu_scheduler.h

index 2df6f174ba7b199ecd7ea39deef1b85647b8fed0..ca22d90324779316e4277144e8c5951002cd4cd8 100644 (file)
@@ -167,32 +167,24 @@ static bool amd_sched_entity_is_idle(struct amd_sched_entity *entity)
  * @sched       Pointer to scheduler instance
  * @entity     The pointer to a valid scheduler entity
  *
- * return 0 if succeed. negative error code on failure
+ * Cleanup and free the allocated resources.
  */
-int amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
-                           struct amd_sched_entity *entity)
+void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
+                          struct amd_sched_entity *entity)
 {
        struct amd_sched_rq *rq = entity->belongto_rq;
-       long r;
 
        if (!amd_sched_entity_is_initialized(sched, entity))
-               return 0;
+               return;
 
        /**
         * The client will not queue more IBs during this fini, consume existing
         * queued IBs
        */
-       r = wait_event_timeout(entity->wait_queue,
-               amd_sched_entity_is_idle(entity),
-               msecs_to_jiffies(AMD_GPU_WAIT_IDLE_TIMEOUT_IN_MS));
-
-       if (r <= 0)
-               DRM_INFO("Entity %p is in waiting state during fini\n",
-                        entity);
+       wait_event(entity->wait_queue, amd_sched_entity_is_idle(entity));
 
        amd_sched_rq_remove_entity(rq, entity);
        kfifo_free(&entity->job_queue);
-       return r;
 }
 
 /**
index 44909b16c3a3ac5367d04448e9a60483fa38461d..128f908c6021631b65ff13026d42a1586ca87143 100644 (file)
@@ -27,8 +27,6 @@
 #include <linux/kfifo.h>
 #include <linux/fence.h>
 
-#define AMD_GPU_WAIT_IDLE_TIMEOUT_IN_MS                3000
-
 struct amd_gpu_scheduler;
 struct amd_sched_rq;
 
@@ -124,8 +122,8 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
                          struct amd_sched_entity *entity,
                          struct amd_sched_rq *rq,
                          uint32_t jobs);
-int amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
-                         struct amd_sched_entity *entity);
+void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
+                          struct amd_sched_entity *entity);
 int amd_sched_entity_push_job(struct amd_sched_job *sched_job);
 
 struct amd_sched_fence *amd_sched_fence_create(