From 5c729cb1b83f3caebc18aa3f5c1d4d6f97811fc4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Tue, 18 Jul 2023 09:03:13 -0700 Subject: [PATCH] anv: Replace handle by anv_bo in the gem_close() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit struct anv_bo will be needed in the next patch to properly handle closure of userptr bos. Signed-off-by: José Roberto de Souza Reviewed-by: Lionel Landwerlin Part-of: --- 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 9ac81a8..0641996 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 ec399a7..463ecdb 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 6497d7f..36d3343 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 d8f0a83..a7673fc 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 cff22f5..3e36edb 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); } -- 2.7.4