From 018178842efafda13344e2726901f22d470fce1b Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Wed, 12 Nov 2025 18:14:28 -0500 Subject: [PATCH] zink: Lock queue_lock in zink_destroy_screen Fixes: 015eda4a4186c ("zink: deduplicate VkDevice and VkInstance") Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_screen.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index f6a0f28f800..ecc91a86eb4 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1525,13 +1525,19 @@ zink_destroy_screen(struct pipe_screen *pscreen) struct zink_screen *screen = zink_screen(pscreen); if (!screen->device_lost && screen->queue) { + // Multiple screens can share a queue, so we need to lock queue_lock even + // in the screen destructor + simple_mtx_lock(screen->queue_lock); VkResult result = VKSCR(QueueWaitIdle)(screen->queue); + simple_mtx_unlock(screen->queue_lock); if (result != VK_SUCCESS) mesa_loge("ZINK: vkQueueWaitIdle failed (%s)", vk_Result_to_str(result)); if (screen->queue_sparse && screen->queue_sparse != screen->queue) { + simple_mtx_lock(screen->queue_lock); result = VKSCR(QueueWaitIdle)(screen->queue_sparse); + simple_mtx_unlock(screen->queue_lock); if (result != VK_SUCCESS) mesa_loge("ZINK: vkQueueWaitIdle failed (%s)", vk_Result_to_str(result));