]> www.infradead.org Git - linux-platform-drivers-x86.git/commitdiff
drm/i915: Move pinning to inside engine_wa_list_verify()
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 23 Mar 2021 15:50:13 +0000 (16:50 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 24 Mar 2021 16:27:20 +0000 (17:27 +0100)
This should be done as part of the ww loop, in order to remove a
i915_vma_pin that needs ww held.

Now only i915_ggtt_pin() callers remaining.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210323155059.628690-25-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/gt/intel_gtt.c
drivers/gpu/drm/i915/gt/intel_gtt.h
drivers/gpu/drm/i915/gt/intel_workarounds.c
drivers/gpu/drm/i915/gt/selftest_execlists.c
drivers/gpu/drm/i915/gt/selftest_lrc.c
drivers/gpu/drm/i915/gt/selftest_mocs.c
drivers/gpu/drm/i915/gt/selftest_workarounds.c

index 04aa6601e984932a6269e9317da40919a96125d1..444d9bacfafd16f86b22368cd31f47b359bd0c03 100644 (file)
@@ -427,7 +427,6 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size)
 {
        struct drm_i915_gem_object *obj;
        struct i915_vma *vma;
-       int err;
 
        obj = i915_gem_object_create_internal(vm->i915, PAGE_ALIGN(size));
        if (IS_ERR(obj))
@@ -441,6 +440,19 @@ __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size)
                return vma;
        }
 
+       return vma;
+}
+
+struct i915_vma *
+__vm_create_scratch_for_read_pinned(struct i915_address_space *vm, unsigned long size)
+{
+       struct i915_vma *vma;
+       int err;
+
+       vma = __vm_create_scratch_for_read(vm, size);
+       if (IS_ERR(vma))
+               return vma;
+
        err = i915_vma_pin(vma, 0, 0,
                           i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
        if (err) {
index 29c10fde8ce3f5eafbe3e3b9cd36117a43cda766..af90090c3d1827591aca5788f28f7cfb2f7a271b 100644 (file)
@@ -576,6 +576,9 @@ void i915_vm_free_pt_stash(struct i915_address_space *vm,
 struct i915_vma *
 __vm_create_scratch_for_read(struct i915_address_space *vm, unsigned long size);
 
+struct i915_vma *
+__vm_create_scratch_for_read_pinned(struct i915_address_space *vm, unsigned long size);
+
 static inline struct sgt_dma {
        struct scatterlist *sg;
        dma_addr_t dma, max;
index 8c0c050c4af9e3a79dc59ef08019141a41a3cc2e..3380a3672de6d9eed9b65b60ca61d618a6bfb5b0 100644 (file)
@@ -2213,10 +2213,15 @@ retry:
        if (err)
                goto err_pm;
 
+       err = i915_vma_pin_ww(vma, &ww, 0, 0,
+                          i915_vma_is_ggtt(vma) ? PIN_GLOBAL : PIN_USER);
+       if (err)
+               goto err_unpin;
+
        rq = i915_request_create(ce);
        if (IS_ERR(rq)) {
                err = PTR_ERR(rq);
-               goto err_unpin;
+               goto err_vma;
        }
 
        err = i915_request_await_object(rq, vma->obj, true);
@@ -2257,6 +2262,8 @@ retry:
 
 err_rq:
        i915_request_put(rq);
+err_vma:
+       i915_vma_unpin(vma);
 err_unpin:
        intel_context_unpin(ce);
 err_pm:
@@ -2267,7 +2274,6 @@ err_pm:
        }
        i915_gem_ww_ctx_fini(&ww);
        intel_engine_pm_put(ce->engine);
-       i915_vma_unpin(vma);
        i915_vma_put(vma);
        return err;
 }
index 264b5ebdb021f0e7ac3d45024ced166e4290e827..14ca097e3679b0128c825f5196b42cfeb51fafa7 100644 (file)
@@ -4197,8 +4197,9 @@ static int preserved_virtual_engine(struct intel_gt *gt,
        int err = 0;
        u32 *cs;
 
-       scratch = __vm_create_scratch_for_read(&siblings[0]->gt->ggtt->vm,
-                                              PAGE_SIZE);
+       scratch =
+               __vm_create_scratch_for_read_pinned(&siblings[0]->gt->ggtt->vm,
+                                                   PAGE_SIZE);
        if (IS_ERR(scratch))
                return PTR_ERR(scratch);
 
index 920979a894137c9755810a182ebdf667a97a3742..688fd6f6c47d95586f0a6a1e751c95f7da7ae59f 100644 (file)
@@ -27,7 +27,7 @@
 
 static struct i915_vma *create_scratch(struct intel_gt *gt)
 {
-       return __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE);
+       return __vm_create_scratch_for_read_pinned(&gt->ggtt->vm, PAGE_SIZE);
 }
 
 static bool is_active(struct i915_request *rq)
index cf373c72359e53ee95b00dcd4f0cafe473fe83cb..a539f68d08b9ff27e1e56556f043a123c9075307 100644 (file)
@@ -75,7 +75,8 @@ static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt)
        if (flags & (HAS_GLOBAL_MOCS | HAS_ENGINE_MOCS))
                arg->mocs = table;
 
-       arg->scratch = __vm_create_scratch_for_read(&gt->ggtt->vm, PAGE_SIZE);
+       arg->scratch =
+               __vm_create_scratch_for_read_pinned(&gt->ggtt->vm, PAGE_SIZE);
        if (IS_ERR(arg->scratch))
                return PTR_ERR(arg->scratch);
 
index 2070b91cb6077a7814eea7c40587d76b4b186735..7ce7955c44d41556ff8a5eee2dc2c03915928ae7 100644 (file)
@@ -490,7 +490,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
        u32 *cs, *results;
 
        sz = (2 * ARRAY_SIZE(values) + 1) * sizeof(u32);
-       scratch = __vm_create_scratch_for_read(ce->vm, sz);
+       scratch = __vm_create_scratch_for_read_pinned(ce->vm, sz);
        if (IS_ERR(scratch))
                return PTR_ERR(scratch);
 
@@ -1030,14 +1030,14 @@ static int live_isolated_whitelist(void *arg)
 
        for (i = 0; i < ARRAY_SIZE(client); i++) {
                client[i].scratch[0] =
-                       __vm_create_scratch_for_read(gt->vm, 4096);
+                       __vm_create_scratch_for_read_pinned(gt->vm, 4096);
                if (IS_ERR(client[i].scratch[0])) {
                        err = PTR_ERR(client[i].scratch[0]);
                        goto err;
                }
 
                client[i].scratch[1] =
-                       __vm_create_scratch_for_read(gt->vm, 4096);
+                       __vm_create_scratch_for_read_pinned(gt->vm, 4096);
                if (IS_ERR(client[i].scratch[1])) {
                        err = PTR_ERR(client[i].scratch[1]);
                        i915_vma_unpin_and_release(&client[i].scratch[0], 0);