From 38e0067643b9f4a0da7be87b72f5fc977f6e730a Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sun, 2 May 2021 21:08:00 -0700 Subject: [PATCH] venus: fix dmabuf import fail path When we fail, we should not close gem_handle when there is already a bo with the same gem handle. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_renderer_virtgpu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/virtio/vulkan/vn_renderer_virtgpu.c b/src/virtio/vulkan/vn_renderer_virtgpu.c index d1a69824069..9d63190716e 100644 --- a/src/virtio/vulkan/vn_renderer_virtgpu.c +++ b/src/virtio/vulkan/vn_renderer_virtgpu.c @@ -1153,12 +1153,14 @@ virtgpu_bo_create_from_dmabuf(struct vn_renderer *renderer, struct virtgpu *gpu = (struct virtgpu *)renderer; struct drm_virtgpu_resource_info info; uint32_t gem_handle = 0; + struct virtgpu_bo *bo = NULL; mtx_lock(&gpu->dmabuf_import_mutex); gem_handle = virtgpu_ioctl_prime_fd_to_handle(gpu, fd); if (!gem_handle) goto fail; + bo = util_sparse_array_get(&gpu->bo_array, gem_handle); if (virtgpu_ioctl_resource_info(gpu, gem_handle, &info)) goto fail; @@ -1184,7 +1186,9 @@ virtgpu_bo_create_from_dmabuf(struct vn_renderer *renderer, mmap_size = 0; } - struct virtgpu_bo *bo = util_sparse_array_get(&gpu->bo_array, gem_handle); + /* we check bo->gem_handle instead of bo->refcount because bo->refcount + * might only be memset to 0 and is not considered initialized in theory + */ if (bo->gem_handle == gem_handle) { if (bo->base.mmap_size < mmap_size) goto fail; @@ -1214,7 +1218,7 @@ virtgpu_bo_create_from_dmabuf(struct vn_renderer *renderer, return VK_SUCCESS; fail: - if (gem_handle) + if (gem_handle && bo->gem_handle != gem_handle) virtgpu_ioctl_gem_close(gpu, gem_handle); mtx_unlock(&gpu->dmabuf_import_mutex); return VK_ERROR_INVALID_EXTERNAL_HANDLE;