[Intel-gfx] [PATCH] drm/i915: Force ordering on request submission and hangcheck
Chris Wilson
chris at chris-wilson.co.uk
Wed Jan 13 09:54:54 PST 2016
On Wed, Jan 13, 2016 at 07:04:53PM +0200, Mika Kuoppala wrote:
> Hangcheck is run on irq context and might be active on a
s/irq/process/ that we pretend is irq-like.
> completely different CPU that is submitting requests. And as
> we have been very careful not to add locking to hangcheck to guard
> against driver failures, we need to be careful with the coherency.
>
> Update ring last seqno and add to request lists early, with
> write memory barrier, before pushing the request to ring. On
> hangcheck side, use read memory barrier before inspecting the ring
> last seqno. This ensures that when hangcheck is inspecting the
> state, it will not see a active ring without requests in it,
> and then falsely report it as a missed irq situation.
You are just moving the race, not closing it afaict.
> ring_idle(struct intel_engine_cs *ring, u32 seqno)
> {
> - return (list_empty(&ring->request_list) ||
> - i915_seqno_passed(seqno, ring->last_submitted_seqno));
> + rmb(); /* Ordering against __i915_add_request() */
> + return (i915_seqno_passed(seqno, ring->last_submitted_seqno)
> + || list_empty(&ring->request_list));
But we can get rid of list_empty()!
If we just embrace the race, we can do this simply by checking for the
same idle waiter twice.
http://lists.freedesktop.org/archives/intel-gfx/2016-January/084514.html
which is the most recent variant.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list