Treat VM_BIND vmas as persistent and handle them during the
request submission in the execbuff path.

Cc: Joonas Lahtinen <[email protected]>
Cc: Jon Bloomfield <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Chris P Wilson <[email protected]>
Cc: Sudeep Dutt <[email protected]>
Cc: Stuart Summers <[email protected]>
Signed-off-by: Niranjana Vishwanathapura <[email protected]>
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 26 +++++++++++++++++++
 drivers/gpu/drm/i915/gem/i915_gem_svm.c       |  1 +
 drivers/gpu/drm/i915/gt/intel_gtt.c           | 10 +++++++
 drivers/gpu/drm/i915/i915_vma.h               | 15 ++++++++++-
 drivers/gpu/drm/i915/i915_vma_types.h         |  4 +++
 5 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index b3d9a4a02568..6aaffb9a817f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -723,6 +723,26 @@ static int eb_select_context(struct i915_execbuffer *eb)
        return 0;
 }
 
+static int eb_lookup_persistent_vmas(struct i915_address_space *vm)
+{
+       struct i915_vma *vma;
+       int ret = 0;
+
+       mutex_lock(&vm->svm_mutex);
+       list_for_each_entry(vma, &vm->svm_list, svm_link) {
+               u64 pin_flags = vma->va_start | PIN_OFFSET_FIXED | PIN_USER;
+
+               if (drm_mm_node_allocated(&vma->node))
+                       continue;
+
+               ret = i915_vma_pin(vma, 0, 0, pin_flags);
+               if (ret)
+                       break;
+       }
+       mutex_unlock(&vm->svm_mutex);
+       return ret;
+}
+
 static int eb_lookup_vmas(struct i915_execbuffer *eb)
 {
        struct radix_tree_root *handles_vma = &eb->gem_context->handles_vma;
@@ -1765,6 +1785,12 @@ static noinline int eb_relocate_slow(struct 
i915_execbuffer *eb)
 
 static int eb_relocate(struct i915_execbuffer *eb)
 {
+       int ret;
+
+       ret = eb_lookup_persistent_vmas(eb->context->vm);
+       if (ret)
+               return ret;
+
        if (eb_lookup_vmas(eb))
                goto slow;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_svm.c 
b/drivers/gpu/drm/i915/gem/i915_gem_svm.c
index f26567ea0e3a..e5e45ccc4262 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_svm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_svm.c
@@ -58,6 +58,7 @@ int i915_gem_vm_bind_svm_obj(struct i915_address_space *vm,
                        goto put_obj;
                }
                vma->va_start = va->start;
+               i915_vma_set_persistent(vma);
                /* Disable eviction for now */
                __i915_vma_pin(vma);
 
diff --git a/drivers/gpu/drm/i915/gt/intel_gtt.c 
b/drivers/gpu/drm/i915/gt/intel_gtt.c
index 897aad1f7c08..e0195906de20 100644
--- a/drivers/gpu/drm/i915/gt/intel_gtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_gtt.c
@@ -234,9 +234,19 @@ static inline struct i915_address_space 
*active_to_vm(struct i915_active *ref)
 int i915_vm_move_to_active(struct i915_address_space *vm,
                           struct i915_request *rq)
 {
+       struct i915_vma *vma;
        int ret = 0;
 
        mutex_lock(&vm->svm_mutex);
+       list_for_each_entry(vma, &vm->svm_list, svm_link) {
+               /* Wait for the vma to be bound before we start! */
+               ret = i915_request_await_active(rq, &vma->active);
+               if (ret)
+                       break;
+
+               if (!ret)
+                       ret = i915_active_add_request(&vm->active, rq);
+       }
        ret = i915_active_add_request(&vm->active, rq);
        mutex_unlock(&vm->svm_mutex);
        return ret;
diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
index 044f3400575c..56cff222e7ca 100644
--- a/drivers/gpu/drm/i915/i915_vma.h
+++ b/drivers/gpu/drm/i915/i915_vma.h
@@ -124,6 +124,16 @@ static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma)
        return i915_vm_to_ggtt(vma->vm)->pin_bias;
 }
 
+static inline bool i915_vma_is_persistent(const struct i915_vma *vma)
+{
+       return test_bit(I915_VMA_PERSISTENT_BIT, __i915_vma_flags(vma));
+}
+
+static inline void i915_vma_set_persistent(struct i915_vma *vma)
+{
+       set_bit(I915_VMA_PERSISTENT_BIT, __i915_vma_flags(vma));
+}
+
 static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)
 {
        i915_gem_object_get(vma->obj);
@@ -376,7 +386,10 @@ void i915_vma_make_purgeable(struct i915_vma *vma);
 static inline int i915_vma_sync(struct i915_vma *vma)
 {
        /* Wait for the asynchronous bindings and pending GPU reads */
-       return i915_active_wait(&vma->active);
+       if (i915_vma_is_persistent(vma))
+               return i915_vm_sync(vma->vm);
+       else
+               return i915_active_wait(&vma->active);
 }
 
 #endif
diff --git a/drivers/gpu/drm/i915/i915_vma_types.h 
b/drivers/gpu/drm/i915/i915_vma_types.h
index d5a4fb4e43a4..8a270280a5ca 100644
--- a/drivers/gpu/drm/i915/i915_vma_types.h
+++ b/drivers/gpu/drm/i915/i915_vma_types.h
@@ -250,6 +250,10 @@ struct i915_vma {
 #define I915_VMA_USERFAULT     ((int)BIT(I915_VMA_USERFAULT_BIT))
 #define I915_VMA_GGTT_WRITE    ((int)BIT(I915_VMA_GGTT_WRITE_BIT))
 
+#define I915_VMA_PERSISTENT_BIT        18
+
+#define I915_VMA_PERSISTENT    ((int)BIT(I915_VMA_PERSISTENT_BIT))
+
        struct i915_active active;
 
 #define I915_VMA_PAGES_BIAS 24
-- 
2.21.0.rc0.32.g243a4c7e27

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to