OSDN Git Service

drm/i915: Refresh the errno to vmf_fault translations
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 2 Sep 2019 04:02:46 +0000 (05:02 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 3 Sep 2019 19:35:04 +0000 (20:35 +0100)
It's been a long time since we accidentally reported -EIO upon wedging,
it can now only be generated by failure to swap in a page.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Reviewed-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190902040303.14195-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_mman.c

index 261c9bd..82db2b7 100644 (file)
@@ -287,6 +287,9 @@ vm_fault_t i915_gem_fault(struct vm_fault *vmf)
                        view.type = I915_GGTT_VIEW_PARTIAL;
                        vma = i915_gem_object_ggtt_pin(obj, &view, 0, 0, flags);
                }
+
+               /* The entire mappable GGTT is pinned? Unexpected! */
+               GEM_BUG_ON(vma == ERR_PTR(-ENOSPC));
        }
        if (IS_ERR(vma)) {
                ret = PTR_ERR(vma);
@@ -333,23 +336,19 @@ err_rpm:
        i915_gem_object_unpin_pages(obj);
 err:
        switch (ret) {
-       case -EIO:
-               /*
-                * We eat errors when the gpu is terminally wedged to avoid
-                * userspace unduly crashing (gl has no provisions for mmaps to
-                * fail). But any other -EIO isn't ours (e.g. swap in failure)
-                * and so needs to be reported.
-                */
-               if (!intel_gt_is_wedged(ggtt->vm.gt))
-                       return VM_FAULT_SIGBUS;
-               /* else, fall through */
-       case -EAGAIN:
-               /*
-                * EAGAIN means the gpu is hung and we'll wait for the error
-                * handler to reset everything when re-faulting in
-                * i915_mutex_lock_interruptible.
-                */
+       default:
+               WARN_ONCE(ret, "unhandled error in %s: %i\n", __func__, ret);
+               /* fallthrough */
+       case -EIO: /* shmemfs failure from swap device */
+       case -EFAULT: /* purged object */
+               return VM_FAULT_SIGBUS;
+
+       case -ENOSPC: /* shmemfs allocation failure */
+       case -ENOMEM: /* our allocation failure */
+               return VM_FAULT_OOM;
+
        case 0:
+       case -EAGAIN:
        case -ERESTARTSYS:
        case -EINTR:
        case -EBUSY:
@@ -358,14 +357,6 @@ err:
                 * already did the job.
                 */
                return VM_FAULT_NOPAGE;
-       case -ENOMEM:
-               return VM_FAULT_OOM;
-       case -ENOSPC:
-       case -EFAULT:
-               return VM_FAULT_SIGBUS;
-       default:
-               WARN_ONCE(ret, "unhandled error in %s: %i\n", __func__, ret);
-               return VM_FAULT_SIGBUS;
        }
 }