From bd3c41425456f6df01cfbc5066c52f427a384b63 Mon Sep 17 00:00:00 2001 From: Srinivasan Shanmugam Date: Sun, 9 Jul 2023 11:09:34 +0530 Subject: [PATCH] drm/amdkfd: Fix stack size in 'amdgpu_amdkfd_unmap_hiq' MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Dynamically allocate large local variable instead of putting it onto the stack to avoid exceeding the stack size: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c: In function ‘amdgpu_amdkfd_unmap_hiq’: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c:868:1: warning: the frame size of 1280 bytes is larger than 1024 bytes [-Wframe-larger-than=] Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202307080505.V12qS0oz-lkp@intel.com Suggested-by: Guchun Chen Cc: Felix Kuehling Cc: Christian König Cc: Alex Deucher Signed-off-by: Srinivasan Shanmugam Acked-by: Guchun Chen Reviewed-by: Mukul Joshi Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 32 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 0040c63..629ca1ad 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -836,33 +836,47 @@ int amdgpu_amdkfd_unmap_hiq(struct amdgpu_device *adev, u32 doorbell_off, { struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst]; struct amdgpu_ring *kiq_ring = &kiq->ring; - struct amdgpu_ring_funcs ring_funcs; - struct amdgpu_ring ring; + struct amdgpu_ring_funcs *ring_funcs; + struct amdgpu_ring *ring; int r = 0; if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) return -EINVAL; - memset(&ring, 0x0, sizeof(struct amdgpu_ring)); - memset(&ring_funcs, 0x0, sizeof(struct amdgpu_ring_funcs)); + ring_funcs = kzalloc(sizeof(*ring_funcs), GFP_KERNEL); + if (!ring_funcs) + return -ENOMEM; + + ring = kzalloc(sizeof(*ring), GFP_KERNEL); + if (!ring) { + r = -ENOMEM; + goto free_ring_funcs; + } - ring_funcs.type = AMDGPU_RING_TYPE_COMPUTE; - ring.doorbell_index = doorbell_off; - ring.funcs = &ring_funcs; + ring_funcs->type = AMDGPU_RING_TYPE_COMPUTE; + ring->doorbell_index = doorbell_off; + ring->funcs = ring_funcs; spin_lock(&kiq->ring_lock); if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) { spin_unlock(&kiq->ring_lock); - return -ENOMEM; + r = -ENOMEM; + goto free_ring; } - kiq->pmf->kiq_unmap_queues(kiq_ring, &ring, RESET_QUEUES, 0, 0); + kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES, 0, 0); if (kiq_ring->sched.ready && !adev->job_hang) r = amdgpu_ring_test_helper(kiq_ring); spin_unlock(&kiq->ring_lock); +free_ring: + kfree(ring); + +free_ring_funcs: + kfree(ring_funcs); + return r; } -- 2.7.4