RE: [PATCH] drm/amdgpu: Use virtual alloc during coredump

"Zhang, Hawking" <[email protected]> Wed, 29 Jul 2026 08:43:47 +0000
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <EAYPR12MB999158BDF66F47ACC1ED16F947FCCA2@EAYPR12MB999158.namprd12.prod.outlook.com>
AMD General

Reviewed-by: Hawking Zhang <[email protected]>

Regards,
Hawking
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Lijo Lazar
Sent: Wednesday, July 29, 2026 3:50 PM
To: [email protected]
Cc: Zhang, Hawking <[email protected]>; Deucher, Alexander <[email protected]>; Pelloux-Prayer, Pierre-Eric <[email protected]>
Subject: [PATCH] drm/amdgpu: Use virtual alloc during coredump

The number of rings with outstanding fences can be large, requiring a bigger allocation. Such allocations don't need to be physically contiguous, so use kvzalloc/kvcalloc which fall back to vmalloc when contiguous memory isn't available. This also matches the existing kvfree used to free these allocations.

Also guard the allocation with ring_count to avoid passing 0 size to allocation routines.

Fixes: eea85914d15b ("drm/amdgpu: save ring content before resetting the device")

Signed-off-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
index 39b2a4c0e011..4dfea36997d4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
@@ -554,7 +554,7 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
        if (job && job->pasid)
                size += sizeof(struct amdgpu_coredump_ib_info) * job->num_ibs;

-       coredump = kzalloc(size, GFP_NOWAIT);
+       coredump = kvzalloc(size, GFP_NOWAIT);
        if (!coredump)
                return;

@@ -597,8 +597,12 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
                total_ring_size += ring->ring_size;
                ring_count++;
        }
-       coredump->rings_dw = kzalloc(total_ring_size, GFP_NOWAIT);
-       coredump->rings = kcalloc(ring_count, sizeof(struct amdgpu_coredump_ring), GFP_NOWAIT);
+       if (ring_count) {
+               coredump->rings_dw = kvzalloc(total_ring_size, GFP_NOWAIT);
+               coredump->rings = kvcalloc(ring_count,
+                                          sizeof(struct amdgpu_coredump_ring),
+                                          GFP_NOWAIT);
+       }
        if (coredump->rings && coredump->rings_dw) {
                for (i = 0, off = 0, idx = 0; i < adev->num_rings && idx < ring_count; i++) {
                        ring = adev->rings[i];
--
2.49.0