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. Arnd