Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa34a6fc authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/guc: Advance over port[0] if set and not preempting



Our execlist emulation is intended to only use a maximum of 2 ports per
engine, so as to not overflow the wq. (By knowing the limits, we can
avoid having to handle the wq exhaustion.) However, upon adding
preemption, we lost the skip over the first port if set for the
non-preemption path. Restore it.

Reported-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Fixes: c41937fd ("drm/i915/guc: Preemption! With GuC")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171124133745.5173-1-chris@chris-wilson.co.uk


Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
parent bb9e0d4b
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -743,7 +743,8 @@ static void guc_dequeue(struct intel_engine_cs *engine)
	if (!rb)
		goto unlock;

	if (HAS_LOGICAL_RING_PREEMPTION(engine->i915) && port_isset(port)) {
	if (port_isset(port)) {
		if (HAS_LOGICAL_RING_PREEMPTION(engine->i915)) {
			struct guc_preempt_work *preempt_work =
				&engine->i915->guc.preempt_work[engine->id];

@@ -754,12 +755,14 @@ static void guc_dequeue(struct intel_engine_cs *engine)
				queue_work(engine->i915->guc.preempt_wq,
					   &preempt_work->work);
				goto unlock;
		} else if (port_isset(last_port)) {
			goto unlock;
			}
		}

		port++;
		if (port_isset(port))
			goto unlock;
	}
	GEM_BUG_ON(port_isset(port));

	do {
		struct i915_priolist *p = rb_entry(rb, typeof(*p), node);