]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: add noinline __init __no_profile to skb_extensions_init() for GCOV compatibility
authorKonstantin Khorenko <khorenko@virtuozzo.com>
Fri, 10 Apr 2026 16:21:50 +0000 (19:21 +0300)
committerJakub Kicinski <kuba@kernel.org>
Sun, 12 Apr 2026 22:29:02 +0000 (15:29 -0700)
With -fprofile-update=atomic in global CFLAGS_GCOV, GCC still cannot
constant-fold the skb_ext_total_length() loop when it is inlined into a
profiled caller.  The existing __no_profile on skb_ext_total_length()
itself is insufficient because after __always_inline expansion the code
resides in the caller's body, which still carries GCOV instrumentation.

Mark skb_extensions_init() with __no_profile so the BUILD_BUG_ON checks
can be evaluated at compile time.  Also mark it noinline to prevent the
compiler from inlining it into skb_init() (which lacks __no_profile),
which would re-expose the function body to GCOV instrumentation.

Add __init since skb_extensions_init() is only called from __init
skb_init().  Previously it was implicitly inlined into the .init.text
section; with noinline it would otherwise remain in permanent .text,
wasting memory after boot.

Build-tested with both CONFIG_GCOV_PROFILE_ALL=y and
CONFIG_KCOV_INSTRUMENT_ALL=y.

Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com>
Link: https://patch.msgid.link/20260410162150.3105738-3-khorenko@virtuozzo.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/skbuff.c

index 87e7d689ab2531c8ce7f1b8221d485f21cc0cac6..7dad68e3b5186cf622a3ed5a6e87c09d46bc3fd6 100644 (file)
@@ -5129,7 +5129,7 @@ static __always_inline __no_profile unsigned int skb_ext_total_length(void)
        return l;
 }
 
-static void skb_extensions_init(void)
+static noinline void __init __no_profile skb_extensions_init(void)
 {
        BUILD_BUG_ON(SKB_EXT_NUM > 8);
        BUILD_BUG_ON(skb_ext_total_length() > 255);