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);