svga: init svga_screen::swc_mutex with mtx_recursive
authorBrian Paul <brianp@vmware.com>
Tue, 23 May 2017 19:16:56 +0000 (13:16 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 24 May 2017 17:33:47 +0000 (11:33 -0600)
If the SVGA3D_BindGBSurface() call in svga_buffer_hw_storage_unmap()
fails, we'll flush and that might involve unmapping other buffers.
That leads to a recursive lock on svga_screen::swc_mutex and causes
a deadlock.  Fix this by initializing the mutex with mtx_recursive.

Note that this only happened on Linux, not Windows.  On Windows, the
mutex functions are implemented with Win32 critical sections which
support recursive locking.

Also add a comment about this.

Fixes VMware bug 1831549 (Unigine Tropics demo freeze on Linux).

Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Neha Bhende<bhenden@vmware.com>
src/gallium/drivers/svga/svga_resource_buffer.c
src/gallium/drivers/svga/svga_screen.c

index 7808903083bdf6100a2259d46e825b115a01bd24..271d0787abb58fc22cb18743d02f7d07da24f463 100644 (file)
@@ -320,6 +320,9 @@ svga_buffer_transfer_unmap( struct pipe_context *pipe,
    }
 
    if (svga_buffer_has_hw_storage(sbuf)) {
+      /* Note: we may wind up flushing here and unmapping other buffers
+       * which leads to recursively locking ss->swc_mutex.
+       */
       svga_buffer_hw_storage_unmap(svga, sbuf);
    }
 
index 95132fbeb822d6e1993b08e8b68e1ff68e458c6b..74e5485c0ef6b0f1cf31e1d896e2cc970a123fc5 100644 (file)
@@ -1157,7 +1157,7 @@ svga_screen_create(struct svga_winsys_screen *sws)
    }
 
    (void) mtx_init(&svgascreen->tex_mutex, mtx_plain);
-   (void) mtx_init(&svgascreen->swc_mutex, mtx_plain);
+   (void) mtx_init(&svgascreen->swc_mutex, mtx_recursive);
 
    svga_screen_cache_init(svgascreen);