On Mon, May 17, 2021 at 05:35:02PM +1000, Jonathan Gray wrote:
> On Tue, May 04, 2021 at 03:44:54PM +0200, m...@fn.de wrote:
> > Thanks for the quick help. I built a kernel with your fix.
> > The system is booting up with a warning, now.
> > 
> > ...
> > scsibus3 at softraid0: 256 targets
> > sd2 at scsibus3 targ 1 lun 0: <OPENBSD, SR RAID 1, 006>
> > sd2: 122103MB, 512 bytes/sector, 250067198 sectors
> > root on sd2a (da12fadb67cf7a4d.a) swap on sd2b dump on sd2b
> > drm : drm_WARN_ON(d->wake_count)drm : drm_WARN_ON(d->wake_count)Device 
> > initialization failed (-22)
> > Automatic boot in progress: starting file system checks.
> > /dev/sd2a (da12fadb67cf7a4d.a): file system is clean; not checking
> > ...
> 
> Thanks, can you try this?

And this diff with commits backported to -current related to vma/pinning.

drm/i915/gt: Prevent use of engine->wa_ctx after error
drm/i915: Fix mismatch between misplaced vma check and vma insert
drm/i915: Hold onto an explicit ref to i915_vma_work.pinned
drm/i915: Use the active reference on the vma while capturing

diff --git sys/dev/pci/drm/i915/gem/i915_gem_execbuffer.c 
sys/dev/pci/drm/i915/gem/i915_gem_execbuffer.c
index 971ed84f371..993c2b22f9f 100644
--- sys/dev/pci/drm/i915/gem/i915_gem_execbuffer.c
+++ sys/dev/pci/drm/i915/gem/i915_gem_execbuffer.c
@@ -365,7 +365,7 @@ eb_vma_misplaced(const struct drm_i915_gem_exec_object2 
*entry,
                return true;
 
        if (!(flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS) &&
-           (vma->node.start + vma->node.size - 1) >> 32)
+           (vma->node.start + vma->node.size + 4095) >> 32)
                return true;
 
        if (flags & __EXEC_OBJECT_NEEDS_MAP &&
diff --git sys/dev/pci/drm/i915/gt/intel_lrc.c 
sys/dev/pci/drm/i915/gt/intel_lrc.c
index ac8eade748b..9bdb964d14f 100644
--- sys/dev/pci/drm/i915/gt/intel_lrc.c
+++ sys/dev/pci/drm/i915/gt/intel_lrc.c
@@ -3462,6 +3462,9 @@ err:
 static void lrc_destroy_wa_ctx(struct intel_engine_cs *engine)
 {
        i915_vma_unpin_and_release(&engine->wa_ctx.vma, 0);
+
+       /* Called on error unwind, clear all flags to prevent further use */
+       memset(&engine->wa_ctx, 0, sizeof(engine->wa_ctx));
 }
 
 typedef u32 *(*wa_bb_func_t)(struct intel_engine_cs *engine, u32 *batch);
diff --git sys/dev/pci/drm/i915/i915_gpu_error.c 
sys/dev/pci/drm/i915/i915_gpu_error.c
index 9d02829f8df..72e25f3d014 100644
--- sys/dev/pci/drm/i915/i915_gpu_error.c
+++ sys/dev/pci/drm/i915/i915_gpu_error.c
@@ -1346,7 +1346,7 @@ capture_vma(struct intel_engine_capture_vma *next,
        }
 
        strlcpy(c->name, name, sizeof(c->name));
-       c->vma = i915_vma_get(vma);
+       c->vma = vma; /* reference held while active */
 
        c->next = next;
        return c;
@@ -1456,7 +1456,6 @@ intel_engine_coredump_add_vma(struct 
intel_engine_coredump *ee,
                                                 compress));
 
                i915_active_release(&vma->active);
-               i915_vma_put(vma);
 
                capture = this->next;
                kfree(this);
diff --git sys/dev/pci/drm/i915/i915_vma.c sys/dev/pci/drm/i915/i915_vma.c
index 2bf2292ae31..8aca774266c 100644
--- sys/dev/pci/drm/i915/i915_vma.c
+++ sys/dev/pci/drm/i915/i915_vma.c
@@ -331,8 +331,10 @@ static void __vma_release(struct dma_fence_work *work)
 {
        struct i915_vma_work *vw = container_of(work, typeof(*vw), base);
 
-       if (vw->pinned)
+       if (vw->pinned) {
                __i915_gem_object_unpin_pages(vw->pinned);
+               i915_gem_object_put(vw->pinned);
+       }
 }
 
 static const struct dma_fence_work_ops bind_ops = {
@@ -448,7 +450,7 @@ int i915_vma_bind(struct i915_vma *vma,
 
                if (vma->obj) {
                        __i915_gem_object_pin_pages(vma->obj);
-                       work->pinned = vma->obj;
+                       work->pinned = i915_gem_object_get(vma->obj);
                }
        } else {
                ret = vma->ops->bind_vma(vma, cache_level, bind_flags);

Reply via email to