From 5df6fc54819eac63a76daccac89ed8842c66b8c1 Mon Sep 17 00:00:00 2001 From: Yogesh Mohan Marimuthu Date: Mon, 30 Mar 2026 12:14:26 +0530 Subject: [PATCH] winsys/amdgpu: pointers to be NULL if num 0 for kernel ioctl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From https://docs.kernel.org/process/botching-up-ioctls.html, Kernel ioctl expects pointers are NULL if number of pointers variable is 0. Kernel ioctl can have checks for these and return failure causing the driver to fail. Reviewed-by: Marek Olšák Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp index 3e91911c834..7504387cdba 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp @@ -1623,17 +1623,16 @@ static int amdgpu_cs_submit_ib_userq(struct amdgpu_userq *userq, struct amdgpu_winsys *aws = acs->aws; struct amdgpu_cs_context *csc = amdgpu_csc_get_submitted(acs); - /* Syncobj dependencies. */ - unsigned num_syncobj_dependencies = csc->syncobj_dependencies.num; - uint32_t *syncobj_dependencies_list = - (uint32_t*)alloca(num_syncobj_dependencies * sizeof(uint32_t)); - /* Currently only 1 vm timeline syncobj can be a dependency. */ uint16_t num_syncobj_timeline_dependencies = 1; uint32_t syncobj_timeline_dependency; uint64_t syncobj_timeline_dependency_point; + /* Syncobj dependencies. */ + unsigned num_syncobj_dependencies = csc->syncobj_dependencies.num; + uint32_t *syncobj_dependencies_list = NULL; if (num_syncobj_dependencies) { + syncobj_dependencies_list = (uint32_t*)alloca(num_syncobj_dependencies * sizeof(uint32_t)); for (unsigned i = 0; i < num_syncobj_dependencies; i++) { struct amdgpu_fence *fence = (struct amdgpu_fence*)csc->syncobj_dependencies.list[i]; @@ -1665,9 +1664,9 @@ static int amdgpu_cs_submit_ib_userq(struct amdgpu_userq *userq, .syncobj_timeline_handles = (uintptr_t)&syncobj_timeline_dependency, .syncobj_timeline_points = (uintptr_t)&syncobj_timeline_dependency_point, /* Wait for previous reads/writes to complete before writing to these BOs. */ - .bo_read_handles = (uintptr_t)shared_buf_kms_handles_write, + .bo_read_handles = num_shared_buf_write ? (uintptr_t)shared_buf_kms_handles_write : 0, /* Wait for previous writes to complete before reading from these BOs. */ - .bo_write_handles = (uintptr_t)shared_buf_kms_handles_read, + .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_syncobj_handles = num_syncobj_dependencies,