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

Author: José Roberto de Souza <[email protected]>
Date:   Tue Jul 18 09:03:13 2023 -0700

anv: Replace handle by anv_bo in the gem_close()

struct anv_bo will be needed in the next patch to properly handle
closure of userptr bos.

Signed-off-by: José Roberto de Souza <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23787>

---

 src/intel/vulkan/anv_allocator.c        | 22 +++++++++++-----------
 src/intel/vulkan/anv_gem_stubs.c        |  4 ++--
 src/intel/vulkan/anv_kmd_backend.h      |  2 +-
 src/intel/vulkan/i915/anv_kmd_backend.c |  4 ++--
 src/intel/vulkan/xe/anv_kmd_backend.c   |  7 +++++--
 5 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
index 9ac81a87d6d..06419965e6e 100644
--- a/src/intel/vulkan/anv_allocator.c
+++ b/src/intel/vulkan/anv_allocator.c
@@ -1371,7 +1371,7 @@ anv_bo_unmap_close(struct anv_device *device, struct 
anv_bo *bo)
       anv_device_unmap_bo(device, bo, bo->map, bo->size);
 
    assert(bo->gem_handle != 0);
-   device->kmd_backend->gem_close(device, bo->gem_handle);
+   device->kmd_backend->gem_close(device, bo);
 }
 
 static void
@@ -1525,7 +1525,7 @@ anv_device_alloc_bo(struct anv_device *device,
       VkResult result = anv_device_map_bo(device, &new_bo, 0, size,
                                           0 /* propertyFlags */, &new_bo.map);
       if (unlikely(result != VK_SUCCESS)) {
-         device->kmd_backend->gem_close(device, new_bo.gem_handle);
+         device->kmd_backend->gem_close(device, &new_bo);
          return result;
       }
    }
@@ -1789,26 +1789,26 @@ anv_device_import_bo(struct anv_device *device,
 
       __sync_fetch_and_add(&bo->refcount, 1);
    } else {
-      off_t size = lseek(fd, 0, SEEK_END);
-      if (size == (off_t)-1) {
-         device->kmd_backend->gem_close(device, gem_handle);
-         pthread_mutex_unlock(&cache->mutex);
-         return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
-      }
-
       struct anv_bo new_bo = {
          .name = "imported",
          .gem_handle = gem_handle,
          .refcount = 1,
          .offset = -1,
-         .size = size,
-         .actual_size = size,
          .flags = bo_flags,
          .is_external = true,
          .has_client_visible_address =
             (alloc_flags & ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS) != 0,
       };
 
+      off_t size = lseek(fd, 0, SEEK_END);
+      if (size == (off_t)-1) {
+         device->kmd_backend->gem_close(device, &new_bo);
+         pthread_mutex_unlock(&cache->mutex);
+         return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
+      }
+      new_bo.size = size;
+      new_bo.actual_size = size;
+
       assert(new_bo._ccs_size == 0);
       VkResult result = anv_bo_vma_alloc_or_close(device, &new_bo,
                                                   alloc_flags,
diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c
index ec399a7d7f6..463ecdb415f 100644
--- a/src/intel/vulkan/anv_gem_stubs.c
+++ b/src/intel/vulkan/anv_gem_stubs.c
@@ -28,9 +28,9 @@
 #include "anv_private.h"
 
 static void
-stub_gem_close(struct anv_device *device, uint32_t gem_handle)
+stub_gem_close(struct anv_device *device, struct anv_bo *bo)
 {
-   close(gem_handle);
+   close(bo->gem_handle);
 }
 
 static uint32_t
diff --git a/src/intel/vulkan/anv_kmd_backend.h 
b/src/intel/vulkan/anv_kmd_backend.h
index 6497d7f3017..36d334374bd 100644
--- a/src/intel/vulkan/anv_kmd_backend.h
+++ b/src/intel/vulkan/anv_kmd_backend.h
@@ -50,7 +50,7 @@ struct anv_kmd_backend {
                           enum anv_bo_alloc_flags alloc_flags,
                           uint64_t *actual_size);
    uint32_t (*gem_create_userptr)(struct anv_device *device, void *mem, 
uint64_t size);
-   void (*gem_close)(struct anv_device *device, uint32_t handle);
+   void (*gem_close)(struct anv_device *device, struct anv_bo *bo);
    /* Returns MAP_FAILED on error */
    void *(*gem_mmap)(struct anv_device *device, struct anv_bo *bo,
                      uint64_t offset, uint64_t size,
diff --git a/src/intel/vulkan/i915/anv_kmd_backend.c 
b/src/intel/vulkan/i915/anv_kmd_backend.c
index d8f0a83a7ef..a7673fce2b2 100644
--- a/src/intel/vulkan/i915/anv_kmd_backend.c
+++ b/src/intel/vulkan/i915/anv_kmd_backend.c
@@ -97,10 +97,10 @@ i915_gem_create(struct anv_device *device,
 }
 
 static void
-i915_gem_close(struct anv_device *device, uint32_t handle)
+i915_gem_close(struct anv_device *device, struct anv_bo *bo)
 {
    struct drm_gem_close close = {
-      .handle = handle,
+      .handle = bo->gem_handle,
    };
 
    intel_ioctl(device->fd, DRM_IOCTL_GEM_CLOSE, &close);
diff --git a/src/intel/vulkan/xe/anv_kmd_backend.c 
b/src/intel/vulkan/xe/anv_kmd_backend.c
index cff22f56cc7..3e36edb4136 100644
--- a/src/intel/vulkan/xe/anv_kmd_backend.c
+++ b/src/intel/vulkan/xe/anv_kmd_backend.c
@@ -60,10 +60,13 @@ xe_gem_create(struct anv_device *device,
 }
 
 static void
-xe_gem_close(struct anv_device *device, uint32_t handle)
+xe_gem_close(struct anv_device *device, struct anv_bo *bo)
 {
+   if (bo->from_host_ptr)
+      return;
+
    struct drm_gem_close close = {
-      .handle = handle,
+      .handle = bo->gem_handle,
    };
    intel_ioctl(device->fd, DRM_IOCTL_GEM_CLOSE, &close);
 }

Reply via email to