Skip to content

Commit

Permalink
drm/i915/execlists: Always clear ring_pause if we do not submit
Browse files Browse the repository at this point in the history
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: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190624092009.30189-1-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Jun 24, 2019
1 parent b2dbf8d commit 8db7933
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion drivers/gpu/drm/i915/gt/intel_lrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,8 @@ ring_set_paused(const struct intel_engine_cs *engine, int state)
* until the dword is false.
*/
engine->status_page.addr[I915_GEM_HWS_PREEMPT] = state;
wmb();
if (state)
wmb();
}

static inline struct i915_priolist *to_priolist(struct rb_node *rb)
Expand Down Expand Up @@ -1243,6 +1244,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
*port = execlists_schedule_in(last, port - execlists->pending);
memset(port + 1, 0, (last_port - port) * sizeof(*port));
execlists_submit_ports(engine);
} else {
ring_set_paused(engine, 0);
}
}

Expand Down

0 comments on commit 8db7933

Please sign in to comment.