drm/i915/gt: Stop cross-polluting PIN_GLOBAL with PIN_USER with no-ppgtt
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 25 May 2020 07:53:36 +0000 (08:53 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 25 May 2020 15:45:50 +0000 (16:45 +0100)
In order to keep userptr distinct from ggtt mmaps in the eyes of
lockdep, we need to avoid marking those userptr vma as PIN_GLOBAL. (So
long as we comply with only using them as local PIN_USER!)

References: https://gitlab.freedesktop.org/drm/intel/-/issues/1880
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200525075347.582-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_ggtt.c

index 66165b10256e542b3a30ab55f7997da219008c14..8c275f8588c3bde39359dfede1ff0b5ca1e46e76 100644 (file)
@@ -424,22 +424,17 @@ static int ggtt_bind_vma(struct i915_vma *vma,
        struct drm_i915_gem_object *obj = vma->obj;
        u32 pte_flags;
 
+       if (i915_vma_is_bound(vma, ~flags & I915_VMA_BIND_MASK))
+               return 0;
+
        /* Applicable to VLV (gen8+ do not support RO in the GGTT) */
        pte_flags = 0;
        if (i915_gem_object_is_readonly(obj))
                pte_flags |= PTE_READ_ONLY;
 
        vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
-
        vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
 
-       /*
-        * Without aliasing PPGTT there's no difference between
-        * GLOBAL/LOCAL_BIND, it's all the same ptes. Hence unconditionally
-        * upgrade to both bound if we bind either to avoid double-binding.
-        */
-       atomic_or(I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND, &vma->flags);
-
        return 0;
 }