Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 062c7fb3 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: remove entity idle timeout v2



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: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarJammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com> (v1)
parent 02537d63
Loading
Loading
Loading
Loading
+5 −13
Original line number Diff line number Diff line
@@ -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,
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;
}

/**
+2 −4
Original line number Diff line number Diff line
@@ -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,7 +122,7 @@ 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,
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);