Mesa (main): tu: Free device->bo_idx and device->bo_list on init failure

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 20 20:49:51 UTC 2021


Module: Mesa
Branch: main
Commit: e0bc11d9d20dc7a97a5b794a57216feefe509593
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e0bc11d9d20dc7a97a5b794a57216feefe509593

Author: Matt Turner <mattst88 at gmail.com>
Date:   Thu Aug 19 20:12:57 2021 -0700

tu: Free device->bo_idx and device->bo_list on init failure

Two related changes:

- in tu_device.c:tu_CreateDevice we need to free both pointers in the
  teardown path after tu_bo_finish(global_bo), which uses the pointers.
  They are allocated in the first call to tu_bo_init(), which happens
  when global_bo is allocated.

- in tu_drm.c:tu_bo_init we need to free bo_list if the bo_idx
  allocation fails. Convert to the goto teardown pattern as well.

Fixes the following dEQP-VK tests:
  dEQP-VK.api.device_init.create_instance_device_intentional_alloc_fail
  dEQP-VK.api.object_management.alloc_callback_fail.device
  dEQP-VK.api.object_management.alloc_callback_fail.device_group

Reviewed-by: Kristian H. Kristensen <hoegsberg at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12481>

---

 src/freedreno/ci/deqp-freedreno-a630-fails.txt | 10 ----------
 src/freedreno/vulkan/tu_device.c               |  3 ++-
 src/freedreno/vulkan/tu_drm.c                  | 18 ++++++++++--------
 3 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/src/freedreno/ci/deqp-freedreno-a630-fails.txt b/src/freedreno/ci/deqp-freedreno-a630-fails.txt
index 1552cd5d1e6..6364415d54a 100644
--- a/src/freedreno/ci/deqp-freedreno-a630-fails.txt
+++ b/src/freedreno/ci/deqp-freedreno-a630-fails.txt
@@ -59,11 +59,6 @@ bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.overlay,Fail
 bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.screen,Fail
 bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.softlight,Fail
 
-# "Fail (createInstance returned VK_ERROR_INITIALIZATION_FAILED)"
-# happens inside the loader on anholt's debian system, and there are various
-# likely-looking fixes in later versions of the loader.
-dEQP-VK.api.device_init.create_instance_device_intentional_alloc_fail,Fail
-
 # optimalTilingFeatures  missing: VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_TRANSFER_SRC_BIT|VK_FORMAT_FEATURE_TRANSFER_DST_BIT|VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT
 dEQP-VK.api.info.format_properties.g8_b8_r8_3plane_420_unorm,Fail
 dEQP-VK.api.info.format_properties.g8_b8r8_2plane_420_unorm,Fail
@@ -76,11 +71,6 @@ dEQP-VK.api.info.image_format_properties.2d.optimal.g8_b8r8_2plane_420_unorm,Fai
 # "Mismatch between VkPhysicalDeviceProtectedMemoryProperties at vktApiFeatureInfo.cpp:4208"
 dEQP-VK.api.info.get_physical_device_properties2.properties,Fail
 
-# LEAK 1: REALLOCATION: original=0x0000000000000000, size=400, alignment=8, scope=3, returnedPtr=0x0000aaaaf6b61310
-# ERROR: Found 1 memory leaks!
-dEQP-VK.api.object_management.alloc_callback_fail.device,Fail
-dEQP-VK.api.object_management.alloc_callback_fail.device_group,Fail
-
 # "deqp-vk: ../src/freedreno/vulkan/tu_cs.h:186: tu_cs_reserve: Assertion `tu_cs_get_space(cs) >= reserved_size' failed."
 # https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8841
 dEQP-VK.spirv_assembly.instruction.compute.opphi.wide,Crash
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index 983b3c10f43..9b136c75719 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -1488,7 +1488,8 @@ fail_pipeline_cache:
    tu_destroy_clear_blit_shaders(device);
 fail_global_bo_map:
    tu_bo_finish(device, &device->global_bo);
-
+   vk_free(&device->vk.alloc, device->bo_idx);
+   vk_free(&device->vk.alloc, device->bo_list);
 fail_global_bo:
    ir3_compiler_destroy(device->compiler);
 
diff --git a/src/freedreno/vulkan/tu_drm.c b/src/freedreno/vulkan/tu_drm.c
index 5ddf290eea8..e3f728cef86 100644
--- a/src/freedreno/vulkan/tu_drm.c
+++ b/src/freedreno/vulkan/tu_drm.c
@@ -246,10 +246,8 @@ tu_bo_init(struct tu_device *dev,
       struct drm_msm_gem_submit_bo *new_ptr =
          vk_realloc(&dev->vk.alloc, dev->bo_list, new_len * sizeof(*dev->bo_list),
                     8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
-      if (!new_ptr) {
-         tu_gem_close(dev, gem_handle);
-         return VK_ERROR_OUT_OF_HOST_MEMORY;
-      }
+      if (!new_ptr)
+         goto fail_bo_list;
 
       dev->bo_list = new_ptr;
       dev->bo_list_size = new_len;
@@ -261,10 +259,8 @@ tu_bo_init(struct tu_device *dev,
       uint32_t *new_ptr =
          vk_realloc(&dev->vk.alloc, dev->bo_idx, new_len * sizeof(*dev->bo_idx),
                     8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
-      if (!new_ptr) {
-         tu_gem_close(dev, gem_handle);
-         return VK_ERROR_OUT_OF_HOST_MEMORY;
-      }
+      if (!new_ptr)
+         goto fail_bo_idx;
 
       dev->bo_idx = new_ptr;
       dev->bo_idx_size = new_len;
@@ -280,6 +276,12 @@ tu_bo_init(struct tu_device *dev,
    mtx_unlock(&dev->bo_mutex);
 
    return VK_SUCCESS;
+
+fail_bo_idx:
+   vk_free(&dev->vk.alloc, dev->bo_list);
+fail_bo_list:
+   tu_gem_close(dev, gem_handle);
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
 }
 
 VkResult



More information about the mesa-commit mailing list