Mesa (master): v3dv: don't log out of pool memory errors for internal driver pools

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 1 12:17:55 UTC 2020


Module: Mesa
Branch: master
Commit: 4f7d4871a6f85ef51c3660bf673426a820c4e1c6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f7d4871a6f85ef51c3660bf673426a820c4e1c6

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Tue Dec  1 11:52:28 2020 +0100

v3dv: don't log out of pool memory errors for internal driver pools

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7848>

---

 src/broadcom/vulkan/v3dv_descriptor_set.c | 21 +++++++++++++++++----
 src/broadcom/vulkan/v3dv_meta_copy.c      | 16 ++++++++++++++--
 src/broadcom/vulkan/v3dv_private.h        |  5 +++++
 3 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c
index af232b97821..1cf09f35248 100644
--- a/src/broadcom/vulkan/v3dv_descriptor_set.c
+++ b/src/broadcom/vulkan/v3dv_descriptor_set.c
@@ -744,6 +744,19 @@ v3dv_DestroyDescriptorSetLayout(VkDevice _device,
    vk_object_free(&device->vk, pAllocator, set_layout);
 }
 
+static inline VkResult
+out_of_pool_memory(const struct v3dv_device *device,
+                   const struct v3dv_descriptor_pool *pool)
+{
+   /* Don't log OOPM errors for internal driver pools, we handle these properly
+    * by allocating a new pool, so they don't point to real issues.
+    */
+   if (!pool->is_driver_internal)
+      return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY)
+   else
+      return VK_ERROR_OUT_OF_POOL_MEMORY;
+}
+
 static VkResult
 descriptor_set_create(struct v3dv_device *device,
                       struct v3dv_descriptor_pool *pool,
@@ -757,7 +770,7 @@ descriptor_set_create(struct v3dv_device *device,
 
    if (pool->host_memory_base) {
       if (pool->host_memory_end - pool->host_memory_ptr < mem_size)
-         return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY);
+         return out_of_pool_memory(device, pool);
 
       set = (struct v3dv_descriptor_set*)pool->host_memory_ptr;
       pool->host_memory_ptr += mem_size;
@@ -786,7 +799,7 @@ descriptor_set_create(struct v3dv_device *device,
    if (layout->bo_size) {
       if (!pool->host_memory_base && pool->entry_count == pool->max_entry_count) {
          vk_object_free(&device->vk, NULL, set);
-         return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY);
+         return out_of_pool_memory(device, pool);
       }
 
       /* We first try to allocate linearly fist, so that we don't spend time
@@ -810,14 +823,14 @@ descriptor_set_create(struct v3dv_device *device,
          }
          if (pool->bo->size - offset < layout->bo_size) {
             vk_object_free(&device->vk, NULL, set);
-            return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY);
+            return out_of_pool_memory(device, pool);
          }
          memmove(&pool->entries[index + 1], &pool->entries[index],
                  sizeof(pool->entries[0]) * (pool->entry_count - index));
       } else {
          assert(pool->host_memory_base);
          vk_object_free(&device->vk, NULL, set);
-         return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY);
+         return out_of_pool_memory(device, pool);
       }
 
       set->base_offset = offset;
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 7ec0a108fc9..cb411d8194e 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -2913,9 +2913,15 @@ create_texel_buffer_copy_descriptor_pool(struct v3dv_cmd_buffer *cmd_buffer)
 
    if (result == VK_SUCCESS) {
       assert(cmd_buffer->meta.texel_buffer_copy.dspool != VK_NULL_HANDLE);
+      const VkDescriptorPool _pool = cmd_buffer->meta.texel_buffer_copy.dspool;
+
       v3dv_cmd_buffer_add_private_obj(
-         cmd_buffer, (uintptr_t)cmd_buffer->meta.texel_buffer_copy.dspool,
+         cmd_buffer, (uintptr_t) _pool,
          (v3dv_cmd_buffer_private_obj_destroy_cb)v3dv_DestroyDescriptorPool);
+
+      struct v3dv_descriptor_pool *pool =
+         v3dv_descriptor_pool_from_handle(_pool);
+      pool->is_driver_internal = true;
    }
 
    return result;
@@ -4946,9 +4952,15 @@ create_blit_descriptor_pool(struct v3dv_cmd_buffer *cmd_buffer)
 
    if (result == VK_SUCCESS) {
       assert(cmd_buffer->meta.blit.dspool != VK_NULL_HANDLE);
+      const VkDescriptorPool _pool = cmd_buffer->meta.blit.dspool;
+
       v3dv_cmd_buffer_add_private_obj(
-         cmd_buffer, (uintptr_t)cmd_buffer->meta.blit.dspool,
+         cmd_buffer, (uintptr_t) _pool,
          (v3dv_cmd_buffer_private_obj_destroy_cb)v3dv_DestroyDescriptorPool);
+
+      struct v3dv_descriptor_pool *pool =
+         v3dv_descriptor_pool_from_handle(_pool);
+      pool->is_driver_internal = true;
    }
 
    return result;
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index a88a8872095..3d806d6d4a1 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -1450,6 +1450,11 @@ struct v3dv_descriptor_pool_entry
 struct v3dv_descriptor_pool {
    struct vk_object_base base;
 
+   /* If this descriptor pool has been allocated for the driver for internal
+    * use, typically to implement meta operations.
+    */
+   bool is_driver_internal;
+
    struct v3dv_bo *bo;
    /* Current offset at the descriptor bo. 0 means that we didn't use it for
     * any descriptor. If the descriptor bo is NULL, current offset is



More information about the mesa-commit mailing list