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

drm/amdgpu: remove deadlocks from amdgpu_userq_pre_reset



The purpose of a GPU reset is to make sure that fence can be signaled
again and the signal and resume workers can make progress again.

So waiting for the resume worker or any fence in the GPU reset path is
just utterly nonsense.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarPrike Liang <Prike.Liang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit fcd5f065eab46993af43442fd77ee8d9eb9c5bdf)
parent 5e28b7b9
Loading
Loading
Loading
Loading
+12 −14
Original line number Diff line number Diff line
@@ -1504,14 +1504,13 @@ void amdgpu_userq_pre_reset(struct amdgpu_device *adev)
{
	const struct amdgpu_userq_funcs *userq_funcs;
	struct amdgpu_usermode_queue *queue;
	struct amdgpu_userq_mgr *uqm;
	unsigned long queue_id;

	/* TODO: We probably need a new lock for the queue state */
	xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) {
		uqm = queue->userq_mgr;
		cancel_delayed_work_sync(&uqm->resume_work);
		if (queue->state == AMDGPU_USERQ_STATE_MAPPED) {
			amdgpu_userq_wait_for_last_fence(queue);
		if (queue->state != AMDGPU_USERQ_STATE_MAPPED)
			continue;

		userq_funcs = adev->userq_funcs[queue->queue_type];
		userq_funcs->unmap(queue);
		/* just mark all queues as hung at this point.
@@ -1522,7 +1521,6 @@ void amdgpu_userq_pre_reset(struct amdgpu_device *adev)
		amdgpu_userq_fence_driver_force_completion(queue);
	}
}
}

int amdgpu_userq_post_reset(struct amdgpu_device *adev, bool vram_lost)
{