diff options
author | Srinivasan Shanmugam <srinivasan.shanmugam@amd.com> | 2023-07-09 11:09:34 +0530 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2023-07-12 12:22:52 -0400 |
commit | bd3c41425456f6df01cfbc5066c52f427a384b63 (patch) | |
tree | 89b0d892dfa8cb93c48f106b6705620aac6961a6 /drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |
parent | 8e436326958f633242f2394d4f7c820eb9320280 (diff) | |
download | linux-bd3c41425456f6df01cfbc5066c52f427a384b63.tar.gz linux-bd3c41425456f6df01cfbc5066c52f427a384b63.tar.bz2 linux-bd3c41425456f6df01cfbc5066c52f427a384b63.zip |
drm/amdkfd: Fix stack size in 'amdgpu_amdkfd_unmap_hiq'
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 <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202307080505.V12qS0oz-lkp@intel.com
Suggested-by: Guchun Chen <guchun.chen@amd.com>
Cc: Felix Kuehling <Felix.Kuehling@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Acked-by: Guchun Chen <guchun.chen@amd.com>
Reviewed-by: Mukul Joshi <mukul.joshi@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 32 |
1 files 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 0040c63e2356..629ca1ad75a8 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; } |