nouveau: fix fence hang
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Sat, 8 Oct 2011 21:05:25 +0000 (23:05 +0200)
committerMarcin Slusarz <marcin.slusarz@gmail.com>
Sun, 9 Oct 2011 12:49:30 +0000 (14:49 +0200)
commit9849f366cbfd781ebeca725058029b70c96836f9
treec7a300247b7b31e49d926b502e8e9b7cb0dd88c0
parent0110aa09e5898987ee86586e438ac571075eba3a
nouveau: fix fence hang

If there is not enough space in pushbuffer for fence emission
(nouveau_fence_emit -> nv50_screen_fence_emit -> MARK_RING),
the pushbuffer is flushed, which through flush_notify ->
nv50_default_flush_notify -> nouveau_fence_update marks currently
emitting fence as flushed. But actual emission is done after this mark.
So later when there is a need to wait on this fence and pushbuffer
was not flushed in between, fence wait will never finish causing
application to hang.

To fix this, introduce new fence state between AVAILABLE and EMITTED,
set it before emission and handle it everywhere.

Additionally obtain fence sequence numbers after possible flush in
MARK_RING, because we want to emit fences in correct order.

Reviewed-by: Christoph Bumiller <e0425955@student.tuwien.ac.at>
Note: This is a candidate for the 7.11 branch.
src/gallium/drivers/nouveau/nouveau_fence.c
src/gallium/drivers/nouveau/nouveau_fence.h
src/gallium/drivers/nouveau/nouveau_screen.h
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nvc0/nvc0_screen.c