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