gallium/swr: Fix multi-context sync fence deadlock.
authorBruce Cherniak <bruce.cherniak@intel.com>
Fri, 4 Jan 2019 20:53:59 +0000 (14:53 -0600)
committerAlok Hota <alok.hota@intel.com>
Wed, 16 Jan 2019 15:26:36 +0000 (09:26 -0600)
Various recreation scenarios lead to API thread getting stuck in
swr_fence_finish().  This is a multi-context issue, whereby one context
overwrites the fence read-value with a previous sync's lesser value.
The fence sync value is supposed to be always increasing.

In swr_fence_cb(), only update the "read" value if the new value is
greater.

(This may seem like we're not waiting on the other context to finish, but
had we needed for it to finish there would have been a wait prior to
submitting a new sync.)

cc: mesa-stable@lists.freedesktop.org

src/gallium/drivers/swr/swr_fence.cpp

index b05ac8cec02fa5a3a8b922b350675c0145fd6c05..074d82a3b47a5e37d3dd40b58b8156df554164d4 100644 (file)
@@ -50,7 +50,9 @@ swr_fence_cb(uint64_t userData, uint64_t userData2, uint64_t userData3)
    swr_fence_do_work(fence);
 
    /* Correct value is in SwrSync data, and not the fence write field. */
-   fence->read = userData2;
+   /* Contexts may not finish in order, but fence value always increases */
+   if (fence->read < userData2)
+      fence->read = userData2;
 }
 
 /*