On Fri, Aug 05, 2022 at 06:16:45PM +0200, Arnd Bergmann wrote: > On Fri, Aug 5, 2022 at 5:32 PM Harry Wentland <harry.wentland@xxxxxxx> wrote: > > > I do notice that these files build with a non-configurable > > > -Wframe-large-than value: > > > > > > $ rg frame_warn_flag drivers/gpu/drm/amd/display/dc/dml/Makefile > > > 54:frame_warn_flag := -Wframe-larger-than=2048 > > > > Tbh, I was looking at the history and I can't find a good reason this > > was added. It should be safe to drop this. I would much rather use > > the CONFIG_FRAME_WARN value than override it. > > > > AFAIK most builds use 2048 by default anyways. > > I'm fairly sure this was done for 32-bit builds, which default to a lower > warning limit of 1024 bytes and would otherwise run into this > problem when 64-bit platforms don't. With the default warning limit, > clang warns even more about an i386 build: > > display/dc/dml/dcn20/display_rq_dlg_calc_20.c:1549:6: error: stack > frame size (1324) exceeds limit (1024) in 'dml20_rq_dlg_get_dlg_reg' > display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c:1550:6: error: stack > frame size (1324) exceeds limit (1024) in 'dml20v2_rq_dlg_get_dlg_reg' > display/dc/dml/dcn30/display_rq_dlg_calc_30.c:1742:6: error: stack > frame size (1484) exceeds limit (1024) in 'dml30_rq_dlg_get_dlg_reg' > display/dc/dml/dcn31/display_rq_dlg_calc_31.c:1571:6: error: stack > frame size (1548) exceeds limit (1024) in 'dml31_rq_dlg_get_dlg_reg' > display/dc/dml/dcn21/display_rq_dlg_calc_21.c:1657:6: error: stack > frame size (1388) exceeds limit (1024) in 'dml21_rq_dlg_get_dlg_reg' > display/dc/dml/dcn32/display_rq_dlg_calc_32.c:206:6: error: stack > frame size (1276) exceeds limit (1024) in 'dml32_rq_dlg_get_dlg_reg' > display/dc/dml/dcn31/display_mode_vba_31.c:2049:13: error: stack frame > size (1468) exceeds limit (1024) in > 'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation' > display/dc/dml/dcn20/display_mode_vba_20v2.c:1145:13: error: stack > frame size (1228) exceeds limit (1024) in > 'dml20v2_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation' > display/dc/dml/dcn20/display_mode_vba_20.c:1085:13: error: stack frame > size (1340) exceeds limit (1024) in > 'dml20_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation' > display/dc/dml/dcn31/display_mode_vba_31.c:3908:6: error: stack frame > size (1996) exceeds limit (1024) in > 'dml31_ModeSupportAndSystemConfigurationFull' > display/dc/dml/dcn21/display_mode_vba_21.c:1466:13: error: stack frame > size (1308) exceeds limit (1024) in > 'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation' > display/dc/dml/dcn20/display_mode_vba_20v2.c:3393:6: error: stack > frame size (1356) exceeds limit (1024) in > 'dml20v2_ModeSupportAndSystemConfigurationFull' > display/dc/dml/dcn20/display_mode_vba_20.c:3286:6: error: stack frame > size (1468) exceeds limit (1024) in > 'dml20_ModeSupportAndSystemConfigurationFull' > display/dc/dml/dcn21/display_mode_vba_21.c:3518:6: error: stack frame > size (1228) exceeds limit (1024) in > 'dml21_ModeSupportAndSystemConfigurationFull' > display/dc/dml/dcn30/display_mode_vba_30.c:1906:13: error: stack frame > size (1436) exceeds limit (1024) in > 'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation' > display/dc/dml/dcn30/display_mode_vba_30.c:3596:6: error: stack frame > size (2092) exceeds limit (1024) in > 'dml30_ModeSupportAndSystemConfigurationFull' > > > I do note that commit 1b54a0121dba ("drm/amd/display: Reduce stack size > > > in the mode support function") did have a workaround for GCC. It appears > > > clang will still inline mode_support_configuration(). If I mark it as > > > 'noinline', the warning disappears in that file. > > > > That'd be the best quick fix. I guess if we split out functions to fix > > stack usage we should mark them as 'noinline' in the future to avoid > > agressive compiler optimizations. > > While splitting out sub-functions can help reduce the maximum stack > usage, it seems that in this case it makes the actual problem worse: > I see 2168 bytes for the combined > dml32_ModeSupportAndSystemConfigurationFull(), but marking > mode_support_configuration() as noinline gives me 1992 bytes > for the outer function plus 384 bytes for the inner one. So it does > avoid the warning (barely), but not the problem that the warning tries > to point out. I haven't had a chance to take a look at splitting things up yet, would you recommend a different approach? Cheers, Nathan