[AMD Official Use Only - AMD Internal Distribution Only] Reviewed-by: Tao Zhou <[email protected]>
> -----Original Message----- > From: SHANMUGAM, SRINIVASAN <[email protected]> > Sent: Friday, December 5, 2025 8:16 PM > To: Koenig, Christian <[email protected]>; Deucher, Alexander > <[email protected]> > Cc: [email protected]; SHANMUGAM, SRINIVASAN > <[email protected]>; Zhou1, Tao > <[email protected]>; Zhang, Hawking <[email protected]> > Subject: [PATCH] drm/amd/ras: Reduce stack usage in > ras_umc_handle_bad_pages() > > ras_umc_handle_bad_pages() function used a large local array: > struct eeprom_umc_record records[MAX_ECC_NUM_PER_RETIREMENT]; > > Move this array off the stack by allocating it with kcalloc() and freeing it > before > return. > > This reduces the stack frame size of ras_umc_handle_bad_pages() and avoids > the frame size warning. > > Fixes the below: > drivers/gpu/drm/amd/amdgpu/../ras/rascore/ras_umc.c:498:5: warning: > stack frame size (1208) exceeds limit (1024) in 'ras_umc_handle_bad_pages' > [-Wframe-larger-than] > > Cc: Tao Zhou <[email protected]> > Cc: Hawking Zhang <[email protected]> > Cc: Christian König <[email protected]> > Cc: Alex Deucher <[email protected]> > Signed-off-by: Srinivasan Shanmugam <[email protected]> > --- > drivers/gpu/drm/amd/ras/rascore/ras_umc.c | 31 ++++++++++++++++++----- > 1 file changed, 24 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c > b/drivers/gpu/drm/amd/ras/rascore/ras_umc.c > index 4dae64c424a2..6061776b894d 100644 > --- a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c > +++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc.c > @@ -497,27 +497,44 @@ static int ras_umc_save_bad_pages(struct > ras_core_context *ras_core) > > int ras_umc_handle_bad_pages(struct ras_core_context *ras_core, void > *data) { > - struct eeprom_umc_record > records[MAX_ECC_NUM_PER_RETIREMENT]; > + struct eeprom_umc_record *records; > int count, ret; > > + records = kcalloc(MAX_ECC_NUM_PER_RETIREMENT, > + sizeof(*records), GFP_KERNEL); > + if (!records) > + return -ENOMEM; > + > + count = ras_umc_get_new_records(ras_core, records, > + MAX_ECC_NUM_PER_RETIREMENT); > + > memset(records, 0, sizeof(records)); > - count = ras_umc_get_new_records(ras_core, records, > ARRAY_SIZE(records)); > - if (count <= 0) > - return -ENODATA; > + count = ras_umc_get_new_records(ras_core, records, > + MAX_ECC_NUM_PER_RETIREMENT); > + if (count <= 0) { > + ret = -ENODATA; > + goto out; > + } > > ret = ras_umc_add_bad_pages(ras_core, records, count, false); > if (ret) { > RAS_DEV_ERR(ras_core->dev, "Failed to add ras bad > page!\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto out; > } > > ret = ras_umc_save_bad_pages(ras_core); > if (ret) { > RAS_DEV_ERR(ras_core->dev, "Failed to save ras bad > page\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto out; > } > > - return 0; > + ret = 0; > + > +out: > + kfree(records); > + return ret; > } > > int ras_umc_sw_init(struct ras_core_context *ras_core) > -- > 2.34.1
