From 5a9e40f028689d6c8f3a74a47034159e67319edf Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" Date: Sat, 23 May 2026 13:48:35 +0200 Subject: [PATCH] v3dv: disable threadeded submissions under drm-shim Threaded submit relies on DRM syncobj wait ioctls blocking until the GPU signals completion. Under drm-shim there is no real GPU, so SYNCOBJ_WAIT returns immediately, creating a race between the submit thread and vkQueueWaitIdle that leads to use-after-free crashes. Detect if we are running under drm-shim by checking the DRM version description, skip enabling threaded submit in that case. Assisted-by: Cursor Agent (Opus 4.6) Signed-off-by: Juan A. Suarez Romero Reviewed-by: Iago Toral Quiroga Part-of: --- src/broadcom/vulkan/v3dv_device.c | 24 ++++++++++++++++++++---- src/broadcom/vulkan/v3dv_device.h | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 113cb786e7d..cbf57788cd9 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1381,6 +1381,12 @@ create_physical_device(struct v3dv_instance *instance, device->render_fd = render_fd; device->display_fd = display_fd; + drmVersionPtr version = drmGetVersion(render_fd); + if (version) { + device->is_shim = version->desc && strcmp(version->desc, "shim") == 0; + drmFreeVersion(version); + } + if (!v3d_get_device_info(device->render_fd, &device->devinfo, &v3d_ioctl)) { result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED, "Failed to get info from device."); @@ -1831,9 +1837,14 @@ queue_init(struct v3dv_device *device, struct v3dv_queue *queue, if (result != VK_SUCCESS) return result; - result = vk_queue_enable_submit_thread(&queue->vk); - if (result != VK_SUCCESS) - goto fail_submit_thread; + /* Threaded submit requires an implementation of syncobj which is not + * available on the shim driver. + */ + if (!device->pdevice->is_shim) { + result = vk_queue_enable_submit_thread(&queue->vk); + if (result != VK_SUCCESS) + goto fail_submit_thread; + } queue->device = device; queue->vk.driver_submit = v3dv_queue_driver_submit; @@ -1962,7 +1973,12 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice, device->vk.copy_sync_payloads = vk_drm_syncobj_copy_payloads; vk_device_set_drm_fd(&device->vk, physical_device->render_fd); - vk_device_enable_threaded_submit(&device->vk); + + /* Threaded submit requires an implementation of syncobj which is not + * available on the shim driver. + */ + if (!physical_device->is_shim) + vk_device_enable_threaded_submit(&device->vk); device->queues = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*device->queues) * total_queues, 8, diff --git a/src/broadcom/vulkan/v3dv_device.h b/src/broadcom/vulkan/v3dv_device.h index e9be3f5295f..5567afdd6b6 100644 --- a/src/broadcom/vulkan/v3dv_device.h +++ b/src/broadcom/vulkan/v3dv_device.h @@ -125,6 +125,8 @@ struct v3dv_physical_device { bool multisync; bool perfmon; } caps; + + bool is_shim; }; static inline struct v3dv_bo *