Skip to content

Commit 752c2ea

Browse files
arndbdavem330
authored andcommitted
cxgb4: reduce kernel stack usage in cudbg_collect_mem_region()
The cudbg_collect_mem_region() and cudbg_read_fw_mem() both use several hundred kilobytes of kernel stack space. One gets inlined into the other, which causes the stack usage to be combined beyond the warning limit when building with clang: drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c:1057:12: error: stack frame size of 1244 bytes in function 'cudbg_collect_mem_region' [-Werror,-Wframe-larger-than=] Restructuring cudbg_collect_mem_region() lets clang do the same optimization that gcc does and reuse the stack slots as it can see that the large variables are never used together. A better fix might be to avoid using cudbg_meminfo on the stack altogether, but that requires a larger rewrite. Fixes: a1c6952 ("cxgb4: collect MC memory dump") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent d12cffe commit 752c2ea

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,14 +1054,12 @@ static void cudbg_t4_fwcache(struct cudbg_init *pdbg_init,
10541054
}
10551055
}
10561056

1057-
static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init,
1058-
struct cudbg_buffer *dbg_buff,
1059-
struct cudbg_error *cudbg_err,
1060-
u8 mem_type)
1057+
static unsigned long cudbg_mem_region_size(struct cudbg_init *pdbg_init,
1058+
struct cudbg_error *cudbg_err,
1059+
u8 mem_type)
10611060
{
10621061
struct adapter *padap = pdbg_init->adap;
10631062
struct cudbg_meminfo mem_info;
1064-
unsigned long size;
10651063
u8 mc_idx;
10661064
int rc;
10671065

@@ -1075,7 +1073,16 @@ static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init,
10751073
if (rc)
10761074
return rc;
10771075

1078-
size = mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base;
1076+
return mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base;
1077+
}
1078+
1079+
static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init,
1080+
struct cudbg_buffer *dbg_buff,
1081+
struct cudbg_error *cudbg_err,
1082+
u8 mem_type)
1083+
{
1084+
unsigned long size = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type);
1085+
10791086
return cudbg_read_fw_mem(pdbg_init, dbg_buff, mem_type, size,
10801087
cudbg_err);
10811088
}

0 commit comments

Comments
 (0)