[AMD Official Use Only - AMD Internal Distribution Only] > -----Original Message----- > From: SHANMUGAM, SRINIVASAN <SRINIVASAN.SHANMUGAM@xxxxxxx> > Sent: Tuesday, October 8, 2024 9:51 AM > To: Koenig, Christian <Christian.Koenig@xxxxxxx>; Deucher, Alexander > <Alexander.Deucher@xxxxxxx> > Cc: amd-gfx@xxxxxxxxxxxxxxxxxxxxx; SHANMUGAM, SRINIVASAN > <SRINIVASAN.SHANMUGAM@xxxxxxx>; Joshi, Mukul <Mukul.Joshi@xxxxxxx>; > Kasiviswanathan, Harish <Harish.Kasiviswanathan@xxxxxxx>; Kuehling, Felix > <Felix.Kuehling@xxxxxxx> > Subject: [PATCH v2] drm/amdkfd: Use dynamic allocation for CU occupancy array in > 'kfd_get_cu_occupancy()' > > 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: 6fc91266b798 ("drm/amdkfd: Update logic for CU occupancy calculations") > Suggested-by: Mukul Joshi <mukul.joshi@xxxxxxx> > Cc: Harish Kasiviswanathan <Harish.Kasiviswanathan@xxxxxxx> > Cc: Felix Kuehling <felix.kuehling@xxxxxxx> > Cc: Christian König <christian.koenig@xxxxxxx> > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@xxxxxxx> > --- > v2: > - Use kcalloc for zero-initialization (Mukul) > - Remove bytes_written call kfree just before the return statement. > (Mukul) > > drivers/gpu/drm/amd/amdkfd/kfd_process.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c > b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > index d665ecdcd12f..186fc4fd3be8 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > @@ -271,10 +271,13 @@ 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; > + int bytes_written; This will generate a compiler warning since bytes_written is not used anywhere. Regards, Mukul > > - memset(cu_occupancy, 0x0, sizeof(cu_occupancy)); > + cu_occupancy = kcalloc(AMDGPU_MAX_QUEUES, sizeof(*cu_occupancy), > GFP_KERNEL); > + if (!cu_occupancy) > + return -ENOMEM; > > pdd = container_of(attr, struct kfd_process_device, attr_cu_occupancy); > dev = pdd->dev; > @@ -318,6 +321,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); } > > -- > 2.34.1