drm/amdkfd: Fix stack size in 'amdgpu_amdkfd_unmap_hiq'
authorSrinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Sun, 9 Jul 2023 05:39:34 +0000 (11:09 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Jul 2023 16:22:52 +0000 (12:22 -0400)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

index 0040c63..629ca1a 100644 (file)
@@ -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;
 }