mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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: Rob Clark <robdclark@chromium.org> Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com> Tested-by: Antonino Maniscalco <antomani103@gmail.com> Reviewed-by: Antonino Maniscalco <antomani103@gmail.com> Patchwork: https://patchwork.freedesktop.org/patch/661499/
This commit is contained in:
parent
feb8ef4636
commit
6a4d287a1a
@ -76,6 +76,23 @@ struct msm_gem_vm {
|
|||||||
|
|
||||||
/** @managed: is this a kernel managed VM? */
|
/** @managed: is this a kernel managed VM? */
|
||||||
bool managed;
|
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)
|
#define to_msm_vm(x) container_of(x, struct msm_gem_vm, base)
|
||||||
|
|
||||||
|
@ -681,6 +681,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
|||||||
if (args->pad)
|
if (args->pad)
|
||||||
return -EINVAL;
|
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
|
/* for now, we just have 3d pipe.. eventually this would need to
|
||||||
* be more clever to dispatch to appropriate gpu module:
|
* be more clever to dispatch to appropriate gpu module:
|
||||||
*/
|
*/
|
||||||
|
@ -389,8 +389,20 @@ static void recover_worker(struct kthread_work *work)
|
|||||||
|
|
||||||
/* Increment the fault counts */
|
/* Increment the fault counts */
|
||||||
submit->queue->faults++;
|
submit->queue->faults++;
|
||||||
if (submit->vm)
|
if (submit->vm) {
|
||||||
to_msm_vm(submit->vm)->faults++;
|
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);
|
get_comm_cmdline(submit, &comm, &cmd);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user