Commit 6a4d287a authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm: Mark VM as unusable on GPU hangs



If userspace has opted-in to VM_BIND, then GPU hangs and VM_BIND errors
will mark the VM as unusable.

Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Signed-off-by: default avatarRob Clark <robin.clark@oss.qualcomm.com>
Tested-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Reviewed-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661499/
parent feb8ef46
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -76,6 +76,23 @@ struct msm_gem_vm {

	/** @managed: is this a kernel managed VM? */
	bool managed;

	/**
	 * @unusable: True if the VM has turned unusable because something
	 * bad happened during an asynchronous request.
	 *
	 * We don't try to recover from such failures, because this implies
	 * informing userspace about the specific operation that failed, and
	 * hoping the userspace driver can replay things from there. This all
	 * sounds very complicated for little gain.
	 *
	 * Instead, we should just flag the VM as unusable, and fail any
	 * further request targeting this VM.
	 *
	 * As an analogy, this would be mapped to a VK_ERROR_DEVICE_LOST
	 * situation, where the logical device needs to be re-created.
	 */
	bool unusable;
};
#define to_msm_vm(x) container_of(x, struct msm_gem_vm, base)

+3 −0
Original line number Diff line number Diff line
@@ -681,6 +681,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
	if (args->pad)
		return -EINVAL;

	if (to_msm_vm(ctx->vm)->unusable)
		return UERR(EPIPE, dev, "context is unusable");

	/* for now, we just have 3d pipe.. eventually this would need to
	 * be more clever to dispatch to appropriate gpu module:
	 */
+14 −2
Original line number Diff line number Diff line
@@ -389,8 +389,20 @@ static void recover_worker(struct kthread_work *work)

	/* Increment the fault counts */
	submit->queue->faults++;
	if (submit->vm)
		to_msm_vm(submit->vm)->faults++;
	if (submit->vm) {
		struct msm_gem_vm *vm = to_msm_vm(submit->vm);

		vm->faults++;

		/*
		 * If userspace has opted-in to VM_BIND (and therefore userspace
		 * management of the VM), faults mark the VM as unusuable.  This
		 * matches vulkan expectations (vulkan is the main target for
		 * VM_BIND)
		 */
		if (!vm->managed)
			vm->unusable = true;
	}

	get_comm_cmdline(submit, &comm, &cmd);