| From efbc7f29a427483e81c2489e7d28ce65a23f2779 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 22 Jul 2019 17:01:23 +0200 |
| Subject: qed: reduce maximum stack frame size |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit 7c116e02a4a7575c8c62bfd2106e3e3ec8fb99dc ] |
| |
| clang warns about an overly large stack frame in one function |
| when it decides to inline all __qed_get_vport_*() functions into |
| __qed_get_vport_stats(): |
| |
| drivers/net/ethernet/qlogic/qed/qed_l2.c:1889:13: error: stack frame size of 1128 bytes in function '_qed_get_vport_stats' [-Werror,-Wframe-larger-than=] |
| |
| Use a noinline_for_stack annotation to prevent clang from inlining |
| these, which keeps the maximum stack usage at around half of that |
| in the worst case, similar to what we get with gcc. |
| |
| Fixes: 86622ee75312 ("qed: Move statistics to L2 code") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/qlogic/qed/qed_l2.c | 34 +++++++++++------------- |
| 1 file changed, 15 insertions(+), 19 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| index 715776e2cfe50..2d198f6ee21d9 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c |
| @@ -1328,10 +1328,9 @@ static void __qed_get_vport_pstats_addrlen(struct qed_hwfn *p_hwfn, |
| } |
| } |
| |
| -static void __qed_get_vport_pstats(struct qed_hwfn *p_hwfn, |
| - struct qed_ptt *p_ptt, |
| - struct qed_eth_stats *p_stats, |
| - u16 statistics_bin) |
| +static noinline_for_stack void |
| +__qed_get_vport_pstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| + struct qed_eth_stats *p_stats, u16 statistics_bin) |
| { |
| struct eth_pstorm_per_queue_stat pstats; |
| u32 pstats_addr = 0, pstats_len = 0; |
| @@ -1351,10 +1350,9 @@ static void __qed_get_vport_pstats(struct qed_hwfn *p_hwfn, |
| p_stats->tx_err_drop_pkts += HILO_64_REGPAIR(pstats.error_drop_pkts); |
| } |
| |
| -static void __qed_get_vport_tstats(struct qed_hwfn *p_hwfn, |
| - struct qed_ptt *p_ptt, |
| - struct qed_eth_stats *p_stats, |
| - u16 statistics_bin) |
| +static noinline_for_stack void |
| +__qed_get_vport_tstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| + struct qed_eth_stats *p_stats, u16 statistics_bin) |
| { |
| struct tstorm_per_port_stat tstats; |
| u32 tstats_addr, tstats_len; |
| @@ -1397,10 +1395,9 @@ static void __qed_get_vport_ustats_addrlen(struct qed_hwfn *p_hwfn, |
| } |
| } |
| |
| -static void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, |
| - struct qed_ptt *p_ptt, |
| - struct qed_eth_stats *p_stats, |
| - u16 statistics_bin) |
| +static noinline_for_stack |
| +void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| + struct qed_eth_stats *p_stats, u16 statistics_bin) |
| { |
| struct eth_ustorm_per_queue_stat ustats; |
| u32 ustats_addr = 0, ustats_len = 0; |
| @@ -1436,10 +1433,9 @@ static void __qed_get_vport_mstats_addrlen(struct qed_hwfn *p_hwfn, |
| } |
| } |
| |
| -static void __qed_get_vport_mstats(struct qed_hwfn *p_hwfn, |
| - struct qed_ptt *p_ptt, |
| - struct qed_eth_stats *p_stats, |
| - u16 statistics_bin) |
| +static noinline_for_stack void |
| +__qed_get_vport_mstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| + struct qed_eth_stats *p_stats, u16 statistics_bin) |
| { |
| struct eth_mstorm_per_queue_stat mstats; |
| u32 mstats_addr = 0, mstats_len = 0; |
| @@ -1463,9 +1459,9 @@ static void __qed_get_vport_mstats(struct qed_hwfn *p_hwfn, |
| HILO_64_REGPAIR(mstats.tpa_coalesced_bytes); |
| } |
| |
| -static void __qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, |
| - struct qed_ptt *p_ptt, |
| - struct qed_eth_stats *p_stats) |
| +static noinline_for_stack void |
| +__qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| + struct qed_eth_stats *p_stats) |
| { |
| struct port_stats port_stats; |
| int j; |
| -- |
| 2.20.1 |
| |