]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdkfd: fix uint32_t overflow in EOP ring buffer size alignment
authorWilliam Palacek <William.Palacek@amd.com>
Mon, 20 Jul 2026 16:51:34 +0000 (12:51 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Jul 2026 23:59:44 +0000 (19:59 -0400)
eop_ring_buffer_size in struct queue_properties is a u32. In
kfd_queue_acquire_buffers() the expected EOP buffer size is computed as
ALIGN(eop_ring_buffer_size, PAGE_SIZE); ALIGN uses typeof(x), so the
addition is done in 32-bit. A user-supplied size of 0xFFFFF001 wraps to
0, causing kfd_queue_buffer_get() to skip its exact-size check (gated on
size != 0) and accept any BO mapped at the address. On GFX8/GFX9 the MQD
cp_hqd_eop_control is then programmed for an 8KB EOP ring backed by a 4KB
BO, so CP EOP writes can land past the buffer and fault the GPU.

Cast the operand to u64 so the alignment is computed in 64-bit; the size
check in kfd_queue_buffer_get() then rejects the oversized request.

Fixes: 42ea9cf2f16b ("drm/amdkfd: Relax size checking during queue buffer get")
Signed-off-by: William Palacek <William.Palacek@amd.com>
Reviewed-by: Alysa Liu <Alysa.Liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit ae443117b742c357bfef3a7bddabf76fcf86e9ef)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdkfd/kfd_queue.c

index 98a5512b701b12f7f9706be221711206413e8eb4..b249e7d1af48d9287d0a73f2899bc3d80006b0dd 100644 (file)
@@ -288,7 +288,7 @@ int kfd_queue_acquire_buffers(struct kfd_process_device *pdd, struct queue_prope
                }
                err = kfd_queue_buffer_get(vm, (void *)properties->eop_ring_buffer_address,
                                           &properties->eop_buf_bo,
-                                          ALIGN(properties->eop_ring_buffer_size, PAGE_SIZE));
+                                          ALIGN((u64)properties->eop_ring_buffer_size, PAGE_SIZE));
                if (err)
                        goto out_err_unreserve;
        }