From 21047e61a50db6d5e92690210f4a5219e025c267 Mon Sep 17 00:00:00 2001 From: Yogesh Mohan Marimuthu Date: Mon, 30 Mar 2026 12:45:21 +0530 Subject: [PATCH] winsys/amdgpu: call userq wait ioctl only once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allocate to hold 256 wait fences. Since there is only one queue per per ip per process, the idea is that there won't be app or windowing system that would have large number of job dependencies / wait fences. If there is an app that has wait fences greater than 256, there won't be corruption issues since kernel will wait for the extra fences. Reviewed-by: Marek Olšák Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp index 7504387cdba..f6ea408336a 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp @@ -1657,7 +1657,9 @@ static int amdgpu_cs_submit_ib_userq(struct amdgpu_userq *userq, } syncobj_signal_list[num_syncobj_to_signal - 1] = ((struct amdgpu_fence*)csc->fence)->syncobj; - struct drm_amdgpu_userq_fence_info *fence_info; + uint16_t num_wait_fences = 256; + struct drm_amdgpu_userq_fence_info *fence_info = (struct drm_amdgpu_userq_fence_info*) + alloca(num_wait_fences * sizeof(struct drm_amdgpu_userq_fence_info)); struct drm_amdgpu_userq_wait userq_wait_data = { .waitq_id = userq->userq_handle, .syncobj_handles = (uintptr_t)syncobj_dependencies_list, @@ -1668,11 +1670,11 @@ static int amdgpu_cs_submit_ib_userq(struct amdgpu_userq *userq, /* Wait for previous writes to complete before reading from these BOs. */ .bo_write_handles = num_shared_buf_read ? (uintptr_t)shared_buf_kms_handles_read : 0, .num_syncobj_timeline_handles = num_syncobj_timeline_dependencies, - .num_fences = 0, + .num_fences = num_wait_fences, .num_syncobj_handles = num_syncobj_dependencies, .num_bo_read_handles = num_shared_buf_write, .num_bo_write_handles = num_shared_buf_read, - .out_fences = (uintptr_t)NULL, + .out_fences = (uintptr_t)fence_info, }; /* @@ -1682,14 +1684,6 @@ static int amdgpu_cs_submit_ib_userq(struct amdgpu_userq *userq, * To implement this strategy, we use amdgpu_userq_wait() before submitting * a job, and amdgpu_userq_signal() after to indicate completion. */ - r = ac_drm_userq_wait(aws->dev, &userq_wait_data); - if (r) - mesa_loge("amdgpu: getting wait num_fences failed\n"); - - fence_info = (struct drm_amdgpu_userq_fence_info*) - alloca(userq_wait_data.num_fences * sizeof(struct drm_amdgpu_userq_fence_info)); - userq_wait_data.out_fences = (uintptr_t)fence_info; - r = ac_drm_userq_wait(aws->dev, &userq_wait_data); if (r) mesa_loge("amdgpu: getting wait fences failed\n");