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

Commit 6af0883e authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: discard commands of killed processes



When a process is killed we shouldn't submit all waiting jobs, but instead
clean up as fast as possible.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarChunming Zhou <david1.zhou@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2e8f9fbe
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -205,17 +205,32 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
			   struct amd_sched_entity *entity)
{
	struct amd_sched_rq *rq = entity->rq;
	int r;

	if (!amd_sched_entity_is_initialized(sched, entity))
		return;

	/**
	 * The client will not queue more IBs during this fini, consume existing
	 * queued IBs
	 * queued IBs or discard them on SIGKILL
	*/
	wait_event(sched->job_scheduled, amd_sched_entity_is_idle(entity));

	if ((current->flags & PF_SIGNALED) && current->exit_code == SIGKILL)
		r = -ERESTARTSYS;
	else
		r = wait_event_killable(sched->job_scheduled,
					amd_sched_entity_is_idle(entity));
	amd_sched_rq_remove_entity(rq, entity);
	if (r) {
		struct amd_sched_job *job;

		/* Park the kernel for a moment to make sure it isn't processing
		 * our enity.
		 */
		kthread_park(sched->thread);
		kthread_unpark(sched->thread);
		while (kfifo_out(&entity->job_queue, &job, sizeof(job)))
			sched->ops->free_job(job);

	}
	kfifo_free(&entity->job_queue);
}