Commit 8db7933e authored by Chris Wilson's avatar Chris Wilson

drm/i915/execlists: Always clear ring_pause if we do not submit

In the unlikely case (thank you CI!), we may find ourselves wanting to
issue a preemption but having no runnable requests left. In this case,
we set the semaphore before computing the preemption and so must unset
it before forgetting (or else we leave the machine busywaiting until the
next request comes along and so likely hang).

v2: Replace readback with only a wmb after asserting the semaphore
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190624092009.30189-1-chris@chris-wilson.co.uk
parent b2dbf8d9
...@@ -240,7 +240,8 @@ ring_set_paused(const struct intel_engine_cs *engine, int state) ...@@ -240,7 +240,8 @@ ring_set_paused(const struct intel_engine_cs *engine, int state)
* until the dword is false. * until the dword is false.
*/ */
engine->status_page.addr[I915_GEM_HWS_PREEMPT] = state; engine->status_page.addr[I915_GEM_HWS_PREEMPT] = state;
wmb(); if (state)
wmb();
} }
static inline struct i915_priolist *to_priolist(struct rb_node *rb) static inline struct i915_priolist *to_priolist(struct rb_node *rb)
...@@ -1243,6 +1244,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine) ...@@ -1243,6 +1244,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
*port = execlists_schedule_in(last, port - execlists->pending); *port = execlists_schedule_in(last, port - execlists->pending);
memset(port + 1, 0, (last_port - port) * sizeof(*port)); memset(port + 1, 0, (last_port - port) * sizeof(*port));
execlists_submit_ports(engine); execlists_submit_ports(engine);
} else {
ring_set_paused(engine, 0);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment