Commit 7d1ff0d9 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/gt: Add breadcrumb retire to physical engine

Avoid adding the retire workers to the virtual engine so that we don't
end up in the unenviable situation of trying to free the virtual engine
while its worker remains active.

Fixes: dc93c9b6 ("drm/i915/gt: Schedule request retirement when signaler idles")
Closes: https://gitlab.freedesktop.org/drm/intel/issues/867


Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Acked-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191219221344.161523-1-chris@chris-wilson.co.uk
parent f7f1538c
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -131,6 +131,14 @@ __dma_fence_signal__notify(struct dma_fence *fence,
	}
}

static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
{
	struct intel_engine_cs *engine =
		container_of(b, struct intel_engine_cs, breadcrumbs);

	intel_engine_add_retire(engine, tl);
}

static void signal_irq_work(struct irq_work *work)
{
	struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
@@ -182,8 +190,7 @@ static void signal_irq_work(struct irq_work *work)
			__list_del_many(&ce->signals, pos);
			if (&ce->signals == pos) { /* now empty */
				list_del_init(&ce->signal_link);
				intel_engine_add_retire(ce->engine,
							ce->timeline);
				add_retire(b, ce->timeline);
			}
		}
	}
+0 −1
Original line number Diff line number Diff line
@@ -4512,7 +4512,6 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx,
	intel_engine_init_active(&ve->base, ENGINE_VIRTUAL);
	intel_engine_init_breadcrumbs(&ve->base);
	intel_engine_init_execlists(&ve->base);
	intel_engine_init_retire(&ve->base);

	ve->base.cops = &virtual_context_ops;
	ve->base.request_alloc = execlists_request_alloc;