]> git.baikalelectronics.ru Git - kernel.git/commit
drm/i915/ringbuffer: Fix use of stale HEAD position whilst polling for space
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 20 Jan 2011 17:00:10 +0000 (17:00 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 20 Jan 2011 17:26:57 +0000 (17:26 +0000)
commit6b2df0248106da48210d1839aacc97365dd2cc18
tree0255506bd3b12333addebf13b0b4ee804ea24f8b
parent8cebc88c033d070eaf47d701d3315d0e45fe0bd8
drm/i915/ringbuffer: Fix use of stale HEAD position whilst polling for space

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: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.h