Mesa (main): v3dv: don't keep an open file descriptor for imported fences/semaphores

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 2 10:12:24 UTC 2021


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

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Tue Jun  1 09:33:36 2021 +0200

v3dv: don't keep an open file descriptor for imported fences/semaphores

We can (and should) close the descriptor immediately after the import.

Gets the following CTS test to pass without requiring to increase limits
for open file descriptors:
dEQP-VK.synchronization.basic.binary_semaphore.chain

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

---

 src/broadcom/ci/deqp-v3dv-rpi4-fails.txt |  1 -
 src/broadcom/vulkan/v3dv_private.h       |  6 -----
 src/broadcom/vulkan/v3dv_queue.c         | 39 ++++++++++----------------------
 3 files changed, 12 insertions(+), 34 deletions(-)

diff --git a/src/broadcom/ci/deqp-v3dv-rpi4-fails.txt b/src/broadcom/ci/deqp-v3dv-rpi4-fails.txt
index 24e9f9f32bb..339a163339d 100644
--- a/src/broadcom/ci/deqp-v3dv-rpi4-fails.txt
+++ b/src/broadcom/ci/deqp-v3dv-rpi4-fails.txt
@@ -34,4 +34,3 @@ dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pac
 dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_x,Fail
 dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_y,Fail
 dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_z,Fail
-dEQP-VK.synchronization.basic.binary_semaphore.chain,Fail
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index 6548f45b7d0..a69fcb19e1b 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -1372,9 +1372,6 @@ struct v3dv_semaphore {
 
    /* A syncobject handle associated with this semaphore */
    uint32_t sync;
-
-   /* The file handle of a fence that we imported into our syncobject */
-   int32_t fd;
 };
 
 struct v3dv_fence {
@@ -1382,9 +1379,6 @@ struct v3dv_fence {
 
    /* A syncobject handle associated with this fence */
    uint32_t sync;
-
-   /* The file handle of a fence that we imported into our syncobject */
-   int32_t fd;
 };
 
 struct v3dv_event {
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index 4e661d18ddf..fe899064878 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -514,21 +514,21 @@ process_semaphores_to_signal(struct v3dv_device *device,
    if (fd == -1)
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
+   VkResult result = VK_SUCCESS;
    for (uint32_t i = 0; i < count; i++) {
       struct v3dv_semaphore *sem = v3dv_semaphore_from_handle(sems[i]);
 
-      if (sem->fd >= 0)
-         close(sem->fd);
-      sem->fd = -1;
-
       int ret = drmSyncobjImportSyncFile(render_fd, sem->sync, fd);
-      if (ret)
-         return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
-
-      sem->fd = fd;
+      if (ret) {
+         result = VK_ERROR_OUT_OF_HOST_MEMORY;
+         break;
+      }
    }
 
-   return VK_SUCCESS;
+   assert(fd >= 0);
+   close(fd);
+
+   return result;
 }
 
 static VkResult
@@ -539,10 +539,6 @@ process_fence_to_signal(struct v3dv_device *device, VkFence _fence)
 
    struct v3dv_fence *fence = v3dv_fence_from_handle(_fence);
 
-   if (fence->fd >= 0)
-      close(fence->fd);
-   fence->fd = -1;
-
    int render_fd = device->pdevice->render_fd;
 
    int fd;
@@ -553,12 +549,11 @@ process_fence_to_signal(struct v3dv_device *device, VkFence _fence)
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
    int ret = drmSyncobjImportSyncFile(render_fd, fence->sync, fd);
-   if (ret)
-      return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   fence->fd = fd;
+   assert(fd >= 0);
+   close(fd);
 
-   return VK_SUCCESS;
+   return ret ? VK_ERROR_OUT_OF_HOST_MEMORY : VK_SUCCESS;
 }
 
 static VkResult
@@ -1131,8 +1126,6 @@ v3dv_CreateSemaphore(VkDevice _device,
    if (sem == NULL)
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   sem->fd = -1;
-
    int ret = drmSyncobjCreate(device->pdevice->render_fd, 0, &sem->sync);
    if (ret) {
       vk_object_free(&device->vk, pAllocator, sem);
@@ -1157,9 +1150,6 @@ v3dv_DestroySemaphore(VkDevice _device,
 
    drmSyncobjDestroy(device->pdevice->render_fd, sem->sync);
 
-   if (sem->fd != -1)
-      close(sem->fd);
-
    vk_object_free(&device->vk, pAllocator, sem);
 }
 
@@ -1188,8 +1178,6 @@ v3dv_CreateFence(VkDevice _device,
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
    }
 
-   fence->fd = -1;
-
    *pFence = v3dv_fence_to_handle(fence);
 
    return VK_SUCCESS;
@@ -1208,9 +1196,6 @@ v3dv_DestroyFence(VkDevice _device,
 
    drmSyncobjDestroy(device->pdevice->render_fd, fence->sync);
 
-   if (fence->fd != -1)
-      close(fence->fd);
-
    vk_object_free(&device->vk, pAllocator, fence);
 }
 



More information about the mesa-commit mailing list