Now that we have pushed the binding itself outside of the vm->mutex, we
are clear of the potential wakeref inversions and can take the wakeref
around the actual duration of the HW interaction.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_ggtt.c | 39 ++++++++++++++++------------
 drivers/gpu/drm/i915/i915_vma.c      |  6 -----
 2 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c 
b/drivers/gpu/drm/i915/gt/intel_ggtt.c
index 59a4a3ab6bfd..a78ae2733fd6 100644
--- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
@@ -434,27 +434,39 @@ static void i915_ggtt_clear_range(struct 
i915_address_space *vm,
        intel_gtt_clear_range(start >> PAGE_SHIFT, length >> PAGE_SHIFT);
 }
 
-static void ggtt_bind_vma(struct i915_address_space *vm,
-                         struct i915_vm_pt_stash *stash,
-                         struct i915_vma *vma,
-                         enum i915_cache_level cache_level,
-                         u32 flags)
+static void __ggtt_bind_vma(struct i915_address_space *vm,
+                           struct i915_vm_pt_stash *stash,
+                           struct i915_vma *vma,
+                           enum i915_cache_level cache_level,
+                           u32 flags)
 {
        struct drm_i915_gem_object *obj = vma->obj;
+       intel_wakeref_t wakeref;
        u32 pte_flags;
 
-       if (i915_vma_is_bound(vma, ~flags & I915_VMA_BIND_MASK))
-               return;
-
        /* 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;
 
-       vm->insert_entries(vm, vma, cache_level, pte_flags);
+       with_intel_runtime_pm(vm->gt->uncore->rpm, wakeref)
+               vm->insert_entries(vm, vma, cache_level, pte_flags);
+
        vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
 }
 
+static void ggtt_bind_vma(struct i915_address_space *vm,
+                         struct i915_vm_pt_stash *stash,
+                         struct i915_vma *vma,
+                         enum i915_cache_level cache_level,
+                         u32 flags)
+{
+       if (i915_vma_is_bound(vma, ~flags & I915_VMA_BIND_MASK))
+               return;
+
+       __ggtt_bind_vma(vm, stash, vma, cache_level, flags);
+}
+
 static void ggtt_unbind_vma(struct i915_address_space *vm, struct i915_vma 
*vma)
 {
        vm->clear_range(vm, vma->node.start, vma->size);
@@ -571,19 +583,12 @@ static void aliasing_gtt_bind_vma(struct 
i915_address_space *vm,
                                  enum i915_cache_level cache_level,
                                  u32 flags)
 {
-       u32 pte_flags;
-
-       /* Currently applicable only to VLV */
-       pte_flags = 0;
-       if (i915_gem_object_is_readonly(vma->obj))
-               pte_flags |= PTE_READ_ONLY;
-
        if (flags & I915_VMA_LOCAL_BIND)
                ppgtt_bind_vma(&i915_vm_to_ggtt(vm)->alias->vm,
                               stash, vma, cache_level, flags);
 
        if (flags & I915_VMA_GLOBAL_BIND)
-               vm->insert_entries(vm, vma, cache_level, pte_flags);
+               __ggtt_bind_vma(vm, stash, vma, cache_level, flags);
 }
 
 static void aliasing_gtt_unbind_vma(struct i915_address_space *vm,
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 633f335ce892..e584a3355911 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -820,7 +820,6 @@ static int __wait_for_unbind(struct i915_vma *vma, unsigned 
int flags)
 int i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
 {
        struct i915_vma_work *work = NULL;
-       intel_wakeref_t wakeref = 0;
        unsigned int bound;
        int err;
 
@@ -839,9 +838,6 @@ int i915_vma_pin(struct i915_vma *vma, u64 size, u64 
alignment, u64 flags)
                        return err;
        }
 
-       if (flags & PIN_GLOBAL)
-               wakeref = intel_runtime_pm_get(&vma->vm->i915->runtime_pm);
-
        err = __wait_for_unbind(vma, flags);
        if (err)
                goto err_rpm;
@@ -951,8 +947,6 @@ int i915_vma_pin(struct i915_vma *vma, u64 size, u64 
alignment, u64 flags)
 err_fence:
        dma_fence_work_commit_imm(&work->base);
 err_rpm:
-       if (wakeref)
-               intel_runtime_pm_put(&vma->vm->i915->runtime_pm, wakeref);
        if (vma->obj)
                i915_gem_object_unpin_pages(vma->obj);
        return err;
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to