]> git.hungrycats.org Git - linux/commitdiff
Rename .data.once to .data..once to fix resetting WARN*_ONCE
authorMasahiro Yamada <masahiroy@kernel.org>
Wed, 6 Nov 2024 16:14:41 +0000 (01:14 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Dec 2024 09:32:59 +0000 (10:32 +0100)
[ Upstream commit dbefa1f31a91670c9e7dac9b559625336206466f ]

Commit b1fca27d384e ("kernel debug: support resetting WARN*_ONCE")
added support for clearing the state of once warnings. However,
it is not functional when CONFIG_LD_DEAD_CODE_DATA_ELIMINATION or
CONFIG_LTO_CLANG is enabled, because .data.once matches the
.data.[0-9a-zA-Z_]* pattern in the DATA_MAIN macro.

Commit cb87481ee89d ("kbuild: linker script do not match C names unless
LD_DEAD_CODE_DATA_ELIMINATION is configured") was introduced to suppress
the issue for the default CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=n case,
providing a minimal fix for stable backporting. We were aware this did
not address the issue for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y. The
plan was to apply correct fixes and then revert cb87481ee89d. [1]

Seven years have passed since then, yet the #ifdef workaround remains in
place. Meanwhile, commit b1fca27d384e introduced the .data.once section,
and commit dc5723b02e52 ("kbuild: add support for Clang LTO") extended
the #ifdef.

Using a ".." separator in the section name fixes the issue for
CONFIG_LD_DEAD_CODE_DATA_ELIMINATION and CONFIG_LTO_CLANG.

[1]: https://lore.kernel.org/linux-kbuild/CAK7LNASck6BfdLnESxXUeECYL26yUDm0cwRZuM4gmaWUkxjL5g@mail.gmail.com/

Fixes: b1fca27d384e ("kernel debug: support resetting WARN*_ONCE")
Fixes: dc5723b02e52 ("kbuild: add support for Clang LTO")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/asm-generic/vmlinux.lds.h
include/linux/mmdebug.h
include/linux/once.h
include/linux/once_lite.h
include/net/net_debug.h
mm/internal.h

index cb12f164caf1edc73f0f7060e8e802f29eb52588..7e11ca6f86dcdaeb1f6c1eb1fdee978d40864749 100644 (file)
        *(.data..shared_aligned) /* percpu related */                   \
        *(.data..unlikely)                                              \
        __start_once = .;                                               \
-       *(.data.once)                                                   \
+       *(.data..once)                                                  \
        __end_once = .;                                                 \
        STRUCT_ALIGN();                                                 \
        *(__tracepoints)                                                \
index 7c3e7b0b0e8fd6e91140d50432cf98eecb253193..28c21d5b25f6b7f835d77a35f2ce9d1ee7a3400e 100644 (file)
@@ -46,7 +46,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi);
                }                                                       \
        } while (0)
 #define VM_WARN_ON_ONCE_PAGE(cond, page)       ({                      \
-       static bool __section(".data.once") __warned;                   \
+       static bool __section(".data..once") __warned;                  \
        int __ret_warn_once = !!(cond);                                 \
                                                                        \
        if (unlikely(__ret_warn_once && !__warned)) {                   \
@@ -66,7 +66,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi);
        unlikely(__ret_warn);                                           \
 })
 #define VM_WARN_ON_ONCE_FOLIO(cond, folio)     ({                      \
-       static bool __section(".data.once") __warned;                   \
+       static bool __section(".data..once") __warned;                  \
        int __ret_warn_once = !!(cond);                                 \
                                                                        \
        if (unlikely(__ret_warn_once && !__warned)) {                   \
@@ -77,7 +77,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi);
        unlikely(__ret_warn_once);                                      \
 })
 #define VM_WARN_ON_ONCE_MM(cond, mm)           ({                      \
-       static bool __section(".data.once") __warned;                   \
+       static bool __section(".data..once") __warned;                  \
        int __ret_warn_once = !!(cond);                                 \
                                                                        \
        if (unlikely(__ret_warn_once && !__warned)) {                   \
index bc714d414448a7ab982f14d4ab76512170a4689f..30346fcdc7995d465e34162845718387a9258fd4 100644 (file)
@@ -46,7 +46,7 @@ void __do_once_sleepable_done(bool *done, struct static_key_true *once_key,
 #define DO_ONCE(func, ...)                                                  \
        ({                                                                   \
                bool ___ret = false;                                         \
-               static bool __section(".data.once") ___done = false;         \
+               static bool __section(".data..once") ___done = false;        \
                static DEFINE_STATIC_KEY_TRUE(___once_key);                  \
                if (static_branch_unlikely(&___once_key)) {                  \
                        unsigned long ___flags;                              \
@@ -64,7 +64,7 @@ void __do_once_sleepable_done(bool *done, struct static_key_true *once_key,
 #define DO_ONCE_SLEEPABLE(func, ...)                                           \
        ({                                                                      \
                bool ___ret = false;                                            \
-               static bool __section(".data.once") ___done = false;            \
+               static bool __section(".data..once") ___done = false;           \
                static DEFINE_STATIC_KEY_TRUE(___once_key);                     \
                if (static_branch_unlikely(&___once_key)) {                     \
                        ___ret = __do_once_sleepable_start(&___done);           \
index b7bce4983638f8c7d14388142e048f4ddde8b187..27de7bc32a0610afe39ad2d920d1adc141370f51 100644 (file)
@@ -12,7 +12,7 @@
 
 #define __ONCE_LITE_IF(condition)                                      \
        ({                                                              \
-               static bool __section(".data.once") __already_done;     \
+               static bool __section(".data..once") __already_done;    \
                bool __ret_cond = !!(condition);                        \
                bool __ret_once = false;                                \
                                                                        \
index 1e74684cbbdbcd5ba304b935e76376a72d6ba3f2..4a79204c8d306e93bb5aac31fe3bd67cf63c5131 100644 (file)
@@ -27,7 +27,7 @@ void netdev_info(const struct net_device *dev, const char *format, ...);
 
 #define netdev_level_once(level, dev, fmt, ...)                        \
 do {                                                           \
-       static bool __section(".data.once") __print_once;       \
+       static bool __section(".data..once") __print_once;      \
                                                                \
        if (!__print_once) {                                    \
                __print_once = true;                            \
index a0b24d0055795336450e73d306f4ff4c70fa1db8..f773db493a99d039129a593dfa6f217710e8cd6b 100644 (file)
@@ -40,7 +40,7 @@ struct folio_batch;
  * when we specify __GFP_NOWARN.
  */
 #define WARN_ON_ONCE_GFP(cond, gfp)    ({                              \
-       static bool __section(".data.once") __warned;                   \
+       static bool __section(".data..once") __warned;                  \
        int __ret_warn_once = !!(cond);                                 \
                                                                        \
        if (unlikely(!(gfp & __GFP_NOWARN) && __ret_warn_once && !__warned)) { \