• Chris Wilson's avatar
    drm/i915/ringbuffer: Fix use of stale HEAD position whilst polling for space · c7dca47b
    Chris Wilson authored
    During suspend, Linus found that his machine would hang for 3 seconds,
    and identified that intel_ring_buffer_wait() was the culprit:
    
    "Because from looking at the code, I get the notion that
    "intel_read_status_page()" may not be exact. But what happens if that
    inexact value matches our cached ring->actual_head, so we never even
    try to read the exact case? Does it _stay_ inexact for arbitrarily
    long times? If so, we might wait for the ring to empty forever (well,
    until the timeout - the behavior I see), even though the ring really
    _is_ empty."
    
    As the reported HEAD position is only updated every time it crosses a
    64k boundary, whilst draining the ring it is indeed likely to remain one
    value. If that value matches the last known HEAD position, we never read
    the true value from the register and so trigger a timeout.
    Reported-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    c7dca47b
intel_ringbuffer.c 32 KB