]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bridge: multicast: work around clang bug
authorArnd Bergmann <arnd@arndb.de>
Wed, 27 May 2020 13:51:13 +0000 (15:51 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 May 2020 18:34:48 +0000 (11:34 -0700)
Clang-10 and clang-11 run into a corner case of the register
allocator on 32-bit ARM, leading to excessive stack usage from
register spilling:

net/bridge/br_multicast.c:2422:6: error: stack frame size of 1472 bytes in function 'br_multicast_get_stats' [-Werror,-Wframe-larger-than=]

Work around this by marking one of the internal functions as
noinline_for_stack.

Link: https://bugs.llvm.org/show_bug.cgi?id=45802#c9
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_multicast.c

index ad12fe3fca8cfb4888e500b11cd6ade9fb67ed53..83490bf73a13b3f2e0f19d83eab6e780ee8b7204 100644 (file)
@@ -2413,7 +2413,8 @@ void br_multicast_uninit_stats(struct net_bridge *br)
        free_percpu(br->mcast_stats);
 }
 
-static void mcast_stats_add_dir(u64 *dst, u64 *src)
+/* noinline for https://bugs.llvm.org/show_bug.cgi?id=45802#c9 */
+static noinline_for_stack void mcast_stats_add_dir(u64 *dst, u64 *src)
 {
        dst[BR_MCAST_DIR_RX] += src[BR_MCAST_DIR_RX];
        dst[BR_MCAST_DIR_TX] += src[BR_MCAST_DIR_TX];