From 352d44ce5aae0655f36fc53c6169813770c95bd2 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 8 May 2024 22:11:20 +0000 Subject: [PATCH] turnip: virtio: fix error path in virtio_bo_init Fixes: f17c5297d7a ("tu: Add virtgpu support") Signed-off-by: Yiwei Zhang Part-of: (cherry picked from commit 585a87ae53a181ab2a0e73fca0e4d84f75523823) --- .pick_status.json | 2 +- src/freedreno/vulkan/tu_knl_drm_virtio.cc | 27 +++++++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c933592eb50..b53bb4299b6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2224,7 +2224,7 @@ "description": "turnip: virtio: fix error path in virtio_bo_init", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "f17c5297d7a01eb37815f96bbf3a87667a2f3261", "notes": null diff --git a/src/freedreno/vulkan/tu_knl_drm_virtio.cc b/src/freedreno/vulkan/tu_knl_drm_virtio.cc index 999a4af2fd4..03dc2f7111d 100644 --- a/src/freedreno/vulkan/tu_knl_drm_virtio.cc +++ b/src/freedreno/vulkan/tu_knl_drm_virtio.cc @@ -571,6 +571,8 @@ virtio_bo_init(struct tu_device *dev, .size = size, }; VkResult result; + uint32_t res_id; + struct tu_bo *bo; result = virtio_allocate_userspace_iova(dev, size, client_iova, flags, &req.iova); @@ -611,27 +613,28 @@ virtio_bo_init(struct tu_device *dev, vdrm_bo_create(vdev->vdrm, size, blob_flags, req.blob_id, &req.hdr); if (!handle) { - util_vma_heap_free(&dev->vma, req.iova, size); - return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); + result = VK_ERROR_OUT_OF_DEVICE_MEMORY; + goto fail; } - uint32_t res_id = vdrm_handle_to_res_id(vdev->vdrm, handle); - struct tu_bo* bo = tu_device_lookup_bo(dev, res_id); + res_id = vdrm_handle_to_res_id(vdev->vdrm, handle); + bo = tu_device_lookup_bo(dev, res_id); assert(bo && bo->gem_handle == 0); bo->res_id = res_id; result = tu_bo_init(dev, bo, handle, size, req.iova, flags, name); - if (result != VK_SUCCESS) + if (result != VK_SUCCESS) { memset(bo, 0, sizeof(*bo)); - else - *out_bo = bo; + goto fail; + } + + *out_bo = bo; /* We don't use bo->name here because for the !TU_DEBUG=bo case bo->name is NULL. */ tu_bo_set_kernel_name(dev, bo, name); - if (result == VK_SUCCESS && - (mem_property & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) && + if ((mem_property & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) && !(mem_property & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { tu_bo_map(dev, bo); @@ -644,6 +647,12 @@ virtio_bo_init(struct tu_device *dev, tu_sync_cache_bo(dev, bo, 0, VK_WHOLE_SIZE, TU_MEM_SYNC_CACHE_TO_GPU); } + return VK_SUCCESS; + +fail: + mtx_lock(&dev->vma_mutex); + util_vma_heap_free(&dev->vma, req.iova, size); + mtx_unlock(&dev->vma_mutex); return result; }