Commit 810df8de authored by Sunil Khatri's avatar Sunil Khatri Committed by Alex Deucher
Browse files

drm/amdgpu/userq: unmap is to be called before freeing doorbell/wptr bo



Unmap the queue after freeing doorbell and wptr memory is completely
wrong. Any operation on the queue needs the doorbell and wptr to be
valid and hence fixing the ordering.

Also since we are using amdgpu_bo_reserve in non interruptrable mode
so there is no need to check for its return values.

Signed-off-by: default avatarSunil Khatri <sunil.khatri@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 85653fe2
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -639,21 +639,6 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
	queue->hang_detect_fence = NULL;
	amdgpu_userq_wait_for_last_fence(queue);

	r = amdgpu_bo_reserve(queue->db_obj.obj, true);
	if (!r) {
		amdgpu_bo_unpin(queue->db_obj.obj);
		amdgpu_bo_unreserve(queue->db_obj.obj);
	}
	amdgpu_bo_unref(&queue->db_obj.obj);

	r = amdgpu_bo_reserve(queue->wptr_obj.obj, true);
	if (!r) {
		amdgpu_bo_unpin(queue->wptr_obj.obj);
		amdgpu_bo_unreserve(queue->wptr_obj.obj);
	}
	amdgpu_bo_unref(&queue->wptr_obj.obj);

	atomic_dec(&uq_mgr->userq_count[queue->queue_type]);
#if defined(CONFIG_DEBUG_FS)
	debugfs_remove_recursive(queue->debugfs_queue);
#endif
@@ -664,6 +649,19 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
		drm_warn(adev_to_drm(uq_mgr->adev), "trying to destroy a HW mapping userq\n");
		queue->state = AMDGPU_USERQ_STATE_HUNG;
	}

	amdgpu_bo_reserve(queue->db_obj.obj, true);
	amdgpu_bo_unpin(queue->db_obj.obj);
	amdgpu_bo_unreserve(queue->db_obj.obj);
	amdgpu_bo_unref(&queue->db_obj.obj);

	amdgpu_bo_reserve(queue->wptr_obj.obj, true);
	amdgpu_bo_unpin(queue->wptr_obj.obj);
	amdgpu_bo_unreserve(queue->wptr_obj.obj);
	amdgpu_bo_unref(&queue->wptr_obj.obj);

	atomic_dec(&uq_mgr->userq_count[queue->queue_type]);

	amdgpu_userq_cleanup(queue);
	mutex_unlock(&uq_mgr->userq_mutex);
	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);