From 4a6fdeab05227457282fcef28c041fe0eb9369be Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 23 May 2017 13:16:56 -0600 Subject: [PATCH] svga: init svga_screen::swc_mutex with mtx_recursive 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 Reviewed-by: Neha Bhende --- src/gallium/drivers/svga/svga_resource_buffer.c | 3 +++ src/gallium/drivers/svga/svga_screen.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/svga/svga_resource_buffer.c b/src/gallium/drivers/svga/svga_resource_buffer.c index 7808903083b..271d0787abb 100644 --- a/src/gallium/drivers/svga/svga_resource_buffer.c +++ b/src/gallium/drivers/svga/svga_resource_buffer.c @@ -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); } diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index 95132fbeb82..74e5485c0ef 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -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); -- 2.30.2