From cb8dfa496627c38c49dd747d3ea97d44b8dc9662 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Fri, 20 May 2022 20:47:32 +0000 Subject: [PATCH] venus: fix the queue init failure path The prior behavior can ignore certain failure result, and might also clean up queues that are never initialized. Fixes: ddd75330559 ("venus: initial support for queue/fence/semaphore") Signed-off-by: Yiwei Zhang Reviewed-by: Chad Versace Reviewed-by: Ryan Neph Part-of: --- src/virtio/vulkan/vn_device.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c index 14cc2efe9ad..6e04afbd4a0 100644 --- a/src/virtio/vulkan/vn_device.c +++ b/src/virtio/vulkan/vn_device.c @@ -89,28 +89,26 @@ vn_device_init_queues(struct vn_device *dev, if (!queues) return VK_ERROR_OUT_OF_HOST_MEMORY; - VkResult result = VK_SUCCESS; count = 0; for (uint32_t i = 0; i < create_info->queueCreateInfoCount; i++) { + VkResult result; + const VkDeviceQueueCreateInfo *queue_info = &create_info->pQueueCreateInfos[i]; for (uint32_t j = 0; j < queue_info->queueCount; j++) { result = vn_queue_init(dev, &queues[count], queue_info, j); - if (result != VK_SUCCESS) - break; + if (result != VK_SUCCESS) { + for (uint32_t k = 0; k < count; k++) + vn_queue_fini(&queues[k]); + vk_free(alloc, queues); + + return result; + } count++; } } - if (result != VK_SUCCESS) { - for (uint32_t i = 0; i < count; i++) - vn_queue_fini(&queues[i]); - vk_free(alloc, queues); - - return result; - } - dev->queues = queues; dev->queue_count = count;