On Mon, May 17, 2021 at 05:35:02PM +1000, Jonathan Gray wrote:
> On Tue, May 04, 2021 at 03:44:54PM +0200, [email protected] 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);