]> Git Repo - linux.git/commitdiff
drm/amdkfd: Use dynamic allocation for CU occupancy array in 'kfd_get_cu_occupancy()'
authorSrinivasan Shanmugam <[email protected]>
Fri, 4 Oct 2024 03:42:39 +0000 (09:12 +0530)
committerAlex Deucher <[email protected]>
Mon, 4 Nov 2024 17:05:29 +0000 (12:05 -0500)
The `kfd_get_cu_occupancy` function previously declared a large
`cu_occupancy` array as a local variable, which could lead to stack
overflows due to excessive stack usage. This commit replaces the static
array allocation with dynamic memory allocation using `kcalloc`,
thereby reducing the stack size.

This change avoids the risk of stack overflows in kernel space,  in
scenarios where `AMDGPU_MAX_QUEUES` is large. The  allocated memory is
freed using `kfree` before the function returns  to prevent memory
leaks.

Fixes the below with gcc W=1:
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_process.c: In function ‘kfd_get_cu_occupancy’:
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_process.c:322:1: warning: the frame size of 1056 bytes is larger than 1024 bytes [-Wframe-larger-than=]
  322 | }
      | ^

Fixes: 6ae9e1aba97e ("drm/amdkfd: Update logic for CU occupancy calculations")
Cc: Harish Kasiviswanathan <[email protected]>
Cc: Felix Kuehling <[email protected]>
Cc: Christian König <[email protected]>
Cc: Alex Deucher <[email protected]>
Signed-off-by: Srinivasan Shanmugam <[email protected]>
Suggested-by: Mukul Joshi <[email protected]>
Reviewed-by: Mukul Joshi <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
drivers/gpu/drm/amd/amdkfd/kfd_process.c

index d4aa843aacfdd90634a87da4da69fc8045aeb3eb..6bab6fc6a35d61198af05486853ee7d35e1cc41c 100644 (file)
@@ -271,11 +271,9 @@ static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)
        struct kfd_process *proc = NULL;
        struct kfd_process_device *pdd = NULL;
        int i;
-       struct kfd_cu_occupancy cu_occupancy[AMDGPU_MAX_QUEUES];
+       struct kfd_cu_occupancy *cu_occupancy;
        u32 queue_format;
 
-       memset(cu_occupancy, 0x0, sizeof(cu_occupancy));
-
        pdd = container_of(attr, struct kfd_process_device, attr_cu_occupancy);
        dev = pdd->dev;
        if (dev->kfd2kgd->get_cu_occupancy == NULL)
@@ -293,6 +291,10 @@ static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)
        wave_cnt = 0;
        max_waves_per_cu = 0;
 
+       cu_occupancy = kcalloc(AMDGPU_MAX_QUEUES, sizeof(*cu_occupancy), GFP_KERNEL);
+       if (!cu_occupancy)
+               return -ENOMEM;
+
        /*
         * For GFX 9.4.3, fetch the CU occupancy from the first XCC in the partition.
         * For AQL queues, because of cooperative dispatch we multiply the wave count
@@ -318,6 +320,7 @@ static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)
 
        /* Translate wave count to number of compute units */
        cu_cnt = (wave_cnt + (max_waves_per_cu - 1)) / max_waves_per_cu;
+       kfree(cu_occupancy);
        return snprintf(buffer, PAGE_SIZE, "%d\n", cu_cnt);
 }
 
This page took 0.047434 seconds and 4 git commands to generate.