* [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches [not found] <20250717231756.make.423-kees@kernel.org> @ 2025-07-17 23:25 ` Kees Cook 2025-07-18 8:36 ` Mike Rapoport 0 siblings, 1 reply; 10+ messages in thread From: Kees Cook @ 2025-07-17 23:25 UTC (permalink / raw) To: Arnd Bergmann Cc: Kees Cook, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Ard Biesheuvel, Mike Rapoport, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm When KCOV is enabled all functions get instrumented, unless the __no_sanitize_coverage attribute is used. To prepare for __no_sanitize_coverage being applied to __init functions, we have to handle differences in how GCC's inline optimizations get resolved. For x86 this means forcing several functions to be inline with __always_inline. Signed-off-by: Kees Cook <kees@kernel.org> --- Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: <x86@kernel.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Vitaly Kuznetsov <vkuznets@redhat.com> Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Cc: Hans de Goede <hdegoede@redhat.com> Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com> Cc: "Rafael J. Wysocki" <rafael@kernel.org> Cc: Len Brown <lenb@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Mike Rapoport <rppt@kernel.org> Cc: Michal Wilczynski <michal.wilczynski@intel.com> Cc: Juergen Gross <jgross@suse.com> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Cc: Roger Pau Monne <roger.pau@citrix.com> Cc: David Woodhouse <dwmw@amazon.co.uk> Cc: Usama Arif <usama.arif@bytedance.com> Cc: "Guilherme G. Piccoli" <gpiccoli@igalia.com> Cc: Thomas Huth <thuth@redhat.com> Cc: Brian Gerst <brgerst@gmail.com> Cc: <kvm@vger.kernel.org> Cc: <ibm-acpi-devel@lists.sourceforge.net> Cc: <platform-driver-x86@vger.kernel.org> Cc: <linux-acpi@vger.kernel.org> Cc: <linux-trace-kernel@vger.kernel.org> Cc: <linux-efi@vger.kernel.org> Cc: <linux-mm@kvack.org> --- arch/x86/include/asm/acpi.h | 4 ++-- arch/x86/include/asm/realmode.h | 2 +- include/linux/acpi.h | 4 ++-- include/linux/bootconfig.h | 2 +- include/linux/efi.h | 2 +- include/linux/memblock.h | 2 +- include/linux/smp.h | 2 +- arch/x86/kernel/kvm.c | 2 +- arch/x86/mm/init_64.c | 2 +- kernel/kexec_handover.c | 4 ++-- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 5ab1a4598d00..a03aa6f999d1 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h @@ -158,13 +158,13 @@ static inline bool acpi_has_cpu_in_madt(void) } #define ACPI_HAVE_ARCH_SET_ROOT_POINTER -static inline void acpi_arch_set_root_pointer(u64 addr) +static __always_inline void acpi_arch_set_root_pointer(u64 addr) { x86_init.acpi.set_root_pointer(addr); } #define ACPI_HAVE_ARCH_GET_ROOT_POINTER -static inline u64 acpi_arch_get_root_pointer(void) +static __always_inline u64 acpi_arch_get_root_pointer(void) { return x86_init.acpi.get_root_pointer(); } diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h index f607081a022a..e406a1e92c63 100644 --- a/arch/x86/include/asm/realmode.h +++ b/arch/x86/include/asm/realmode.h @@ -78,7 +78,7 @@ extern unsigned char secondary_startup_64[]; extern unsigned char secondary_startup_64_no_verify[]; #endif -static inline size_t real_mode_size_needed(void) +static __always_inline size_t real_mode_size_needed(void) { if (real_mode_header) return 0; /* already allocated. */ diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 71e692f95290..1c5bb1e887cd 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -759,13 +759,13 @@ int acpi_arch_timer_mem_init(struct arch_timer_mem *timer_mem, int *timer_count) #endif #ifndef ACPI_HAVE_ARCH_SET_ROOT_POINTER -static inline void acpi_arch_set_root_pointer(u64 addr) +static __always_inline void acpi_arch_set_root_pointer(u64 addr) { } #endif #ifndef ACPI_HAVE_ARCH_GET_ROOT_POINTER -static inline u64 acpi_arch_get_root_pointer(void) +static __always_inline u64 acpi_arch_get_root_pointer(void) { return 0; } diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h index 3f4b4ac527ca..25df9260d206 100644 --- a/include/linux/bootconfig.h +++ b/include/linux/bootconfig.h @@ -290,7 +290,7 @@ int __init xbc_get_info(int *node_size, size_t *data_size); /* XBC cleanup data structures */ void __init _xbc_exit(bool early); -static inline void xbc_exit(void) +static __always_inline void xbc_exit(void) { _xbc_exit(false); } diff --git a/include/linux/efi.h b/include/linux/efi.h index 7d63d1d75f22..e3776d9cad07 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -1334,7 +1334,7 @@ struct linux_efi_initrd { bool xen_efi_config_table_is_usable(const efi_guid_t *guid, unsigned long table); -static inline +static __always_inline bool efi_config_table_is_usable(const efi_guid_t *guid, unsigned long table) { if (!IS_ENABLED(CONFIG_XEN_EFI)) diff --git a/include/linux/memblock.h b/include/linux/memblock.h index bb19a2534224..b96746376e17 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, NUMA_NO_NODE); } -static inline void *memblock_alloc_from(phys_addr_t size, +static __always_inline void *memblock_alloc_from(phys_addr_t size, phys_addr_t align, phys_addr_t min_addr) { diff --git a/include/linux/smp.h b/include/linux/smp.h index bea8d2826e09..18e9c918325e 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -221,7 +221,7 @@ static inline void wake_up_all_idle_cpus(void) { } #ifdef CONFIG_UP_LATE_INIT extern void __init up_late_init(void); -static inline void smp_init(void) { up_late_init(); } +static __always_inline void smp_init(void) { up_late_init(); } #else static inline void smp_init(void) { } #endif diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 921c1c783bc1..8ae750cde0c6 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -420,7 +420,7 @@ static u64 kvm_steal_clock(int cpu) return steal; } -static inline void __set_percpu_decrypted(void *ptr, unsigned long size) +static inline __init void __set_percpu_decrypted(void *ptr, unsigned long size) { early_set_memory_decrypted((unsigned long) ptr, size); } diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index fdb6cab524f0..76e33bd7c556 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -805,7 +805,7 @@ kernel_physical_mapping_change(unsigned long paddr_start, } #ifndef CONFIG_NUMA -static inline void x86_numa_init(void) +static __always_inline void x86_numa_init(void) { memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0); } diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c index 49634cc3fb43..e49743ae52c5 100644 --- a/kernel/kexec_handover.c +++ b/kernel/kexec_handover.c @@ -310,8 +310,8 @@ static int kho_mem_serialize(struct kho_serialization *ser) return -ENOMEM; } -static void deserialize_bitmap(unsigned int order, - struct khoser_mem_bitmap_ptr *elm) +static void __init deserialize_bitmap(unsigned int order, + struct khoser_mem_bitmap_ptr *elm) { struct kho_mem_phys_bits *bitmap = KHOSER_LOAD_PTR(elm->bitmap); unsigned long bit; -- 2.34.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-17 23:25 ` [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches Kees Cook @ 2025-07-18 8:36 ` Mike Rapoport 2025-07-18 22:51 ` Kees Cook 0 siblings, 1 reply; 10+ messages in thread From: Mike Rapoport @ 2025-07-18 8:36 UTC (permalink / raw) To: Kees Cook Cc: Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Ard Biesheuvel, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm Hi Kees, On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > When KCOV is enabled all functions get instrumented, unless the > __no_sanitize_coverage attribute is used. To prepare for > __no_sanitize_coverage being applied to __init functions, we have to > handle differences in how GCC's inline optimizations get resolved. For > x86 this means forcing several functions to be inline with > __always_inline. > > Signed-off-by: Kees Cook <kees@kernel.org> ... > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > index bb19a2534224..b96746376e17 100644 > --- a/include/linux/memblock.h > +++ b/include/linux/memblock.h > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > NUMA_NO_NODE); > } > > -static inline void *memblock_alloc_from(phys_addr_t size, > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > phys_addr_t align, > phys_addr_t min_addr) I'm curious why from all memblock_alloc* wrappers this is the only one that needs to be __always_inline? -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-18 8:36 ` Mike Rapoport @ 2025-07-18 22:51 ` Kees Cook 2025-07-20 6:10 ` Ard Biesheuvel 2025-07-22 8:26 ` Mike Rapoport 0 siblings, 2 replies; 10+ messages in thread From: Kees Cook @ 2025-07-18 22:51 UTC (permalink / raw) To: Mike Rapoport, Will Deacon Cc: Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Ard Biesheuvel, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > Hi Kees, > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > When KCOV is enabled all functions get instrumented, unless the > > __no_sanitize_coverage attribute is used. To prepare for > > __no_sanitize_coverage being applied to __init functions, we have to > > handle differences in how GCC's inline optimizations get resolved. For > > x86 this means forcing several functions to be inline with > > __always_inline. > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > ... > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > index bb19a2534224..b96746376e17 100644 > > --- a/include/linux/memblock.h > > +++ b/include/linux/memblock.h > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > NUMA_NO_NODE); > > } > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > phys_addr_t align, > > phys_addr_t min_addr) > > I'm curious why from all memblock_alloc* wrappers this is the only one that > needs to be __always_inline? Thread-merge[1], adding Will Deacon, who was kind of asking the same question. Based on what I can tell, GCC has kind of fragile inlining logic, in the sense that it can change whether or not it inlines something based on optimizations. It looks like the kcov instrumentation being added (or in this case, removed) from a function changes the optimization results, and some functions marked "inline" are _not_ inlined. In that case, we end up with __init code calling a function not marked __init, and we get the build warnings I'm trying to eliminate. So, to Will's comment, yes, the problem is somewhat fragile (though using either __always_inline or __init will deterministically solve it). We've tripped over this before with GCC and the solution has usually been to just use __always_inline and move on. For memblock_alloc*, it appears to be that the heuristic GCC uses resulted in only memblock_alloc_from() being a problem in this case. I can certainly mark them all as __always_inline if that is preferred. Some maintainers have wanted things marked __init, some have wanted __always_inline. I opted for __always_inline since that was basically the intent of marking a function "inline" in the first place. I am happy to do whatever. :) -Kees [1] https://lore.kernel.org/lkml/aHouXI5-tyQw78Ht@willie-the-truck/ -- Kees Cook ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-18 22:51 ` Kees Cook @ 2025-07-20 6:10 ` Ard Biesheuvel 2025-07-21 12:47 ` Will Deacon 2025-07-22 8:26 ` Mike Rapoport 1 sibling, 1 reply; 10+ messages in thread From: Ard Biesheuvel @ 2025-07-20 6:10 UTC (permalink / raw) To: Kees Cook Cc: Mike Rapoport, Will Deacon, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > Hi Kees, > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > When KCOV is enabled all functions get instrumented, unless the > > > __no_sanitize_coverage attribute is used. To prepare for > > > __no_sanitize_coverage being applied to __init functions, we have to > > > handle differences in how GCC's inline optimizations get resolved. For > > > x86 this means forcing several functions to be inline with > > > __always_inline. > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > ... > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > index bb19a2534224..b96746376e17 100644 > > > --- a/include/linux/memblock.h > > > +++ b/include/linux/memblock.h > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > NUMA_NO_NODE); > > > } > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > phys_addr_t align, > > > phys_addr_t min_addr) > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > needs to be __always_inline? > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > question. > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > sense that it can change whether or not it inlines something based on > optimizations. It looks like the kcov instrumentation being added (or in > this case, removed) from a function changes the optimization results, > and some functions marked "inline" are _not_ inlined. In that case, we end up > with __init code calling a function not marked __init, and we get the > build warnings I'm trying to eliminate. > > So, to Will's comment, yes, the problem is somewhat fragile (though > using either __always_inline or __init will deterministically solve it). > We've tripped over this before with GCC and the solution has usually > been to just use __always_inline and move on. > Given that 'inline' is already a macro in the kernel, could we just add __attribute__((__always_inline__)) to it when KCOV is enabled? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-20 6:10 ` Ard Biesheuvel @ 2025-07-21 12:47 ` Will Deacon 2025-07-21 20:14 ` Kees Cook 0 siblings, 1 reply; 10+ messages in thread From: Will Deacon @ 2025-07-21 12:47 UTC (permalink / raw) To: Ard Biesheuvel Cc: Kees Cook, Mike Rapoport, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Sun, Jul 20, 2025 at 04:10:01PM +1000, Ard Biesheuvel wrote: > On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > > When KCOV is enabled all functions get instrumented, unless the > > > > __no_sanitize_coverage attribute is used. To prepare for > > > > __no_sanitize_coverage being applied to __init functions, we have to > > > > handle differences in how GCC's inline optimizations get resolved. For > > > > x86 this means forcing several functions to be inline with > > > > __always_inline. > > > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > > > ... > > > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > > index bb19a2534224..b96746376e17 100644 > > > > --- a/include/linux/memblock.h > > > > +++ b/include/linux/memblock.h > > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > > NUMA_NO_NODE); > > > > } > > > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > > phys_addr_t align, > > > > phys_addr_t min_addr) > > > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > > needs to be __always_inline? > > > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > > question. > > > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > > sense that it can change whether or not it inlines something based on > > optimizations. It looks like the kcov instrumentation being added (or in > > this case, removed) from a function changes the optimization results, > > and some functions marked "inline" are _not_ inlined. In that case, we end up > > with __init code calling a function not marked __init, and we get the > > build warnings I'm trying to eliminate. Got it, thanks for the explanation! > > So, to Will's comment, yes, the problem is somewhat fragile (though > > using either __always_inline or __init will deterministically solve it). > > We've tripped over this before with GCC and the solution has usually > > been to just use __always_inline and move on. > > > > Given that 'inline' is already a macro in the kernel, could we just > add __attribute__((__always_inline__)) to it when KCOV is enabled? That sounds like a more robust approach and, by the sounds of it, we could predicate it on GCC too. That would also provide a neat place for a comment describing the problem. Kees, would that work for you? Will ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-21 12:47 ` Will Deacon @ 2025-07-21 20:14 ` Kees Cook 2025-07-21 20:49 ` Kees Cook 0 siblings, 1 reply; 10+ messages in thread From: Kees Cook @ 2025-07-21 20:14 UTC (permalink / raw) To: Will Deacon Cc: Ard Biesheuvel, Mike Rapoport, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Mon, Jul 21, 2025 at 01:47:55PM +0100, Will Deacon wrote: > On Sun, Jul 20, 2025 at 04:10:01PM +1000, Ard Biesheuvel wrote: > > On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > > > When KCOV is enabled all functions get instrumented, unless the > > > > > __no_sanitize_coverage attribute is used. To prepare for > > > > > __no_sanitize_coverage being applied to __init functions, we have to > > > > > handle differences in how GCC's inline optimizations get resolved. For > > > > > x86 this means forcing several functions to be inline with > > > > > __always_inline. > > > > > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > > > > > ... > > > > > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > > > index bb19a2534224..b96746376e17 100644 > > > > > --- a/include/linux/memblock.h > > > > > +++ b/include/linux/memblock.h > > > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > > > NUMA_NO_NODE); > > > > > } > > > > > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > > > phys_addr_t align, > > > > > phys_addr_t min_addr) > > > > > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > > > needs to be __always_inline? > > > > > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > > > question. > > > > > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > > > sense that it can change whether or not it inlines something based on > > > optimizations. It looks like the kcov instrumentation being added (or in > > > this case, removed) from a function changes the optimization results, > > > and some functions marked "inline" are _not_ inlined. In that case, we end up > > > with __init code calling a function not marked __init, and we get the > > > build warnings I'm trying to eliminate. > > Got it, thanks for the explanation! > > > > So, to Will's comment, yes, the problem is somewhat fragile (though > > > using either __always_inline or __init will deterministically solve it). > > > We've tripped over this before with GCC and the solution has usually > > > been to just use __always_inline and move on. > > > > > > > Given that 'inline' is already a macro in the kernel, could we just > > add __attribute__((__always_inline__)) to it when KCOV is enabled? > > That sounds like a more robust approach and, by the sounds of it, we > could predicate it on GCC too. That would also provide a neat place for > a comment describing the problem. > > Kees, would that work for you? That seems like an extremely large hammer for this problem, IMO. It feels like it could cause new strange corner cases. I'd much prefer the small fixes I've currently got since it keeps it focused. KCOV is already enabled for "allmodconfig", so any new instances would be found very quickly, etc. (And GCC's fragility in this regard has already been exposed to these cases -- it's just that I changed one of the combinations of __init vs inline vs instrumentation. I could give it a try, if you really prefer the big hammer approach... -- Kees Cook ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-21 20:14 ` Kees Cook @ 2025-07-21 20:49 ` Kees Cook 2025-07-22 6:55 ` Ard Biesheuvel 0 siblings, 1 reply; 10+ messages in thread From: Kees Cook @ 2025-07-21 20:49 UTC (permalink / raw) To: Will Deacon Cc: Ard Biesheuvel, Mike Rapoport, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Mon, Jul 21, 2025 at 01:14:36PM -0700, Kees Cook wrote: > On Mon, Jul 21, 2025 at 01:47:55PM +0100, Will Deacon wrote: > > On Sun, Jul 20, 2025 at 04:10:01PM +1000, Ard Biesheuvel wrote: > > > On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > > > > When KCOV is enabled all functions get instrumented, unless the > > > > > > __no_sanitize_coverage attribute is used. To prepare for > > > > > > __no_sanitize_coverage being applied to __init functions, we have to > > > > > > handle differences in how GCC's inline optimizations get resolved. For > > > > > > x86 this means forcing several functions to be inline with > > > > > > __always_inline. > > > > > > > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > > > > > > > ... > > > > > > > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > > > > index bb19a2534224..b96746376e17 100644 > > > > > > --- a/include/linux/memblock.h > > > > > > +++ b/include/linux/memblock.h > > > > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > > > > NUMA_NO_NODE); > > > > > > } > > > > > > > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > > > > phys_addr_t align, > > > > > > phys_addr_t min_addr) > > > > > > > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > > > > needs to be __always_inline? > > > > > > > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > > > > question. > > > > > > > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > > > > sense that it can change whether or not it inlines something based on > > > > optimizations. It looks like the kcov instrumentation being added (or in > > > > this case, removed) from a function changes the optimization results, > > > > and some functions marked "inline" are _not_ inlined. In that case, we end up > > > > with __init code calling a function not marked __init, and we get the > > > > build warnings I'm trying to eliminate. > > > > Got it, thanks for the explanation! > > > > > > So, to Will's comment, yes, the problem is somewhat fragile (though > > > > using either __always_inline or __init will deterministically solve it). > > > > We've tripped over this before with GCC and the solution has usually > > > > been to just use __always_inline and move on. > > > > > > > > > > Given that 'inline' is already a macro in the kernel, could we just > > > add __attribute__((__always_inline__)) to it when KCOV is enabled? > > > > That sounds like a more robust approach and, by the sounds of it, we > > could predicate it on GCC too. That would also provide a neat place for > > a comment describing the problem. > > > > Kees, would that work for you? > > That seems like an extremely large hammer for this problem, IMO. It > feels like it could cause new strange corner cases. I'd much prefer the > small fixes I've currently got since it keeps it focused. KCOV is > already enabled for "allmodconfig", so any new instances would be found > very quickly, etc. (And GCC's fragility in this regard has already been > exposed to these cases -- it's just that I changed one of the > combinations of __init vs inline vs instrumentation. > > I could give it a try, if you really prefer the big hammer approach... I gave it a try -- it fails spectacularly. ;) Let's stick to my small fixes instead? -- Kees Cook ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-21 20:49 ` Kees Cook @ 2025-07-22 6:55 ` Ard Biesheuvel 2025-07-22 13:29 ` Will Deacon 0 siblings, 1 reply; 10+ messages in thread From: Ard Biesheuvel @ 2025-07-22 6:55 UTC (permalink / raw) To: Kees Cook Cc: Will Deacon, Mike Rapoport, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Tue, 22 Jul 2025 at 06:49, Kees Cook <kees@kernel.org> wrote: > > On Mon, Jul 21, 2025 at 01:14:36PM -0700, Kees Cook wrote: > > On Mon, Jul 21, 2025 at 01:47:55PM +0100, Will Deacon wrote: > > > On Sun, Jul 20, 2025 at 04:10:01PM +1000, Ard Biesheuvel wrote: > > > > On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > > > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > > > > > When KCOV is enabled all functions get instrumented, unless the > > > > > > > __no_sanitize_coverage attribute is used. To prepare for > > > > > > > __no_sanitize_coverage being applied to __init functions, we have to > > > > > > > handle differences in how GCC's inline optimizations get resolved. For > > > > > > > x86 this means forcing several functions to be inline with > > > > > > > __always_inline. > > > > > > > > > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > > > > > > > > > ... > > > > > > > > > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > > > > > index bb19a2534224..b96746376e17 100644 > > > > > > > --- a/include/linux/memblock.h > > > > > > > +++ b/include/linux/memblock.h > > > > > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > > > > > NUMA_NO_NODE); > > > > > > > } > > > > > > > > > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > > > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > > > > > phys_addr_t align, > > > > > > > phys_addr_t min_addr) > > > > > > > > > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > > > > > needs to be __always_inline? > > > > > > > > > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > > > > > question. > > > > > > > > > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > > > > > sense that it can change whether or not it inlines something based on > > > > > optimizations. It looks like the kcov instrumentation being added (or in > > > > > this case, removed) from a function changes the optimization results, > > > > > and some functions marked "inline" are _not_ inlined. In that case, we end up > > > > > with __init code calling a function not marked __init, and we get the > > > > > build warnings I'm trying to eliminate. > > > > > > Got it, thanks for the explanation! > > > > > > > > So, to Will's comment, yes, the problem is somewhat fragile (though > > > > > using either __always_inline or __init will deterministically solve it). > > > > > We've tripped over this before with GCC and the solution has usually > > > > > been to just use __always_inline and move on. > > > > > > > > > > > > > Given that 'inline' is already a macro in the kernel, could we just > > > > add __attribute__((__always_inline__)) to it when KCOV is enabled? > > > > > > That sounds like a more robust approach and, by the sounds of it, we > > > could predicate it on GCC too. That would also provide a neat place for > > > a comment describing the problem. > > > > > > Kees, would that work for you? > > > > That seems like an extremely large hammer for this problem, IMO. It > > feels like it could cause new strange corner cases. I'd much prefer the > > small fixes I've currently got since it keeps it focused. KCOV is > > already enabled for "allmodconfig", so any new instances would be found > > very quickly, etc. (And GCC's fragility in this regard has already been > > exposed to these cases -- it's just that I changed one of the > > combinations of __init vs inline vs instrumentation. > > > > I could give it a try, if you really prefer the big hammer approach... > > I gave it a try -- it fails spectacularly. ;) Let's stick to my small > fixes instead? > Fair enough :-) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-22 6:55 ` Ard Biesheuvel @ 2025-07-22 13:29 ` Will Deacon 0 siblings, 0 replies; 10+ messages in thread From: Will Deacon @ 2025-07-22 13:29 UTC (permalink / raw) To: Ard Biesheuvel Cc: Kees Cook, Mike Rapoport, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Tue, Jul 22, 2025 at 04:55:47PM +1000, Ard Biesheuvel wrote: > On Tue, 22 Jul 2025 at 06:49, Kees Cook <kees@kernel.org> wrote: > > > > On Mon, Jul 21, 2025 at 01:14:36PM -0700, Kees Cook wrote: > > > On Mon, Jul 21, 2025 at 01:47:55PM +0100, Will Deacon wrote: > > > > On Sun, Jul 20, 2025 at 04:10:01PM +1000, Ard Biesheuvel wrote: > > > > > On Sat, 19 Jul 2025 at 08:51, Kees Cook <kees@kernel.org> wrote: > > > > > > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > > > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > > > > > > When KCOV is enabled all functions get instrumented, unless the > > > > > > > > __no_sanitize_coverage attribute is used. To prepare for > > > > > > > > __no_sanitize_coverage being applied to __init functions, we have to > > > > > > > > handle differences in how GCC's inline optimizations get resolved. For > > > > > > > > x86 this means forcing several functions to be inline with > > > > > > > > __always_inline. > > > > > > > > > > > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > > > > > > > > > > > ... > > > > > > > > > > > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > > > > > > index bb19a2534224..b96746376e17 100644 > > > > > > > > --- a/include/linux/memblock.h > > > > > > > > +++ b/include/linux/memblock.h > > > > > > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > > > > > > NUMA_NO_NODE); > > > > > > > > } > > > > > > > > > > > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > > > > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > > > > > > phys_addr_t align, > > > > > > > > phys_addr_t min_addr) > > > > > > > > > > > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > > > > > > needs to be __always_inline? > > > > > > > > > > > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > > > > > > question. > > > > > > > > > > > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > > > > > > sense that it can change whether or not it inlines something based on > > > > > > optimizations. It looks like the kcov instrumentation being added (or in > > > > > > this case, removed) from a function changes the optimization results, > > > > > > and some functions marked "inline" are _not_ inlined. In that case, we end up > > > > > > with __init code calling a function not marked __init, and we get the > > > > > > build warnings I'm trying to eliminate. > > > > > > > > Got it, thanks for the explanation! > > > > > > > > > > So, to Will's comment, yes, the problem is somewhat fragile (though > > > > > > using either __always_inline or __init will deterministically solve it). > > > > > > We've tripped over this before with GCC and the solution has usually > > > > > > been to just use __always_inline and move on. > > > > > > > > > > > > > > > > Given that 'inline' is already a macro in the kernel, could we just > > > > > add __attribute__((__always_inline__)) to it when KCOV is enabled? > > > > > > > > That sounds like a more robust approach and, by the sounds of it, we > > > > could predicate it on GCC too. That would also provide a neat place for > > > > a comment describing the problem. > > > > > > > > Kees, would that work for you? > > > > > > That seems like an extremely large hammer for this problem, IMO. It > > > feels like it could cause new strange corner cases. I'd much prefer the > > > small fixes I've currently got since it keeps it focused. KCOV is > > > already enabled for "allmodconfig", so any new instances would be found > > > very quickly, etc. (And GCC's fragility in this regard has already been > > > exposed to these cases -- it's just that I changed one of the > > > combinations of __init vs inline vs instrumentation. > > > > > > I could give it a try, if you really prefer the big hammer approach... > > > > I gave it a try -- it fails spectacularly. ;) Let's stick to my small > > fixes instead? > > > > Fair enough :-) (but please add the helpful explanation you provided to the commit message!) Will ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches 2025-07-18 22:51 ` Kees Cook 2025-07-20 6:10 ` Ard Biesheuvel @ 2025-07-22 8:26 ` Mike Rapoport 1 sibling, 0 replies; 10+ messages in thread From: Mike Rapoport @ 2025-07-22 8:26 UTC (permalink / raw) To: Kees Cook Cc: Will Deacon, Arnd Bergmann, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, Paolo Bonzini, Vitaly Kuznetsov, Henrique de Moraes Holschuh, Hans de Goede, Ilpo Järvinen, Rafael J. Wysocki, Len Brown, Masami Hiramatsu, Ard Biesheuvel, Michal Wilczynski, Juergen Gross, Andy Shevchenko, Kirill A. Shutemov, Roger Pau Monne, David Woodhouse, Usama Arif, Guilherme G. Piccoli, Thomas Huth, Brian Gerst, kvm, ibm-acpi-devel, platform-driver-x86, linux-acpi, linux-trace-kernel, linux-efi, linux-mm, Ingo Molnar, Gustavo A. R. Silva, Christoph Hellwig, Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada, Nathan Chancellor, Nicolas Schier, Nick Desaulniers, Bill Wendling, Justin Stitt, linux-kernel, kasan-dev, linux-doc, linux-arm-kernel, kvmarm, linux-riscv, linux-s390, linux-hardening, linux-kbuild, linux-security-module, linux-kselftest, sparclinux, llvm On Fri, Jul 18, 2025 at 03:51:28PM -0700, Kees Cook wrote: > On Fri, Jul 18, 2025 at 11:36:32AM +0300, Mike Rapoport wrote: > > Hi Kees, > > > > On Thu, Jul 17, 2025 at 04:25:09PM -0700, Kees Cook wrote: > > > When KCOV is enabled all functions get instrumented, unless the > > > __no_sanitize_coverage attribute is used. To prepare for > > > __no_sanitize_coverage being applied to __init functions, we have to > > > handle differences in how GCC's inline optimizations get resolved. For > > > x86 this means forcing several functions to be inline with > > > __always_inline. > > > > > > Signed-off-by: Kees Cook <kees@kernel.org> > > > > ... > > > > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > > > index bb19a2534224..b96746376e17 100644 > > > --- a/include/linux/memblock.h > > > +++ b/include/linux/memblock.h > > > @@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size, > > > NUMA_NO_NODE); > > > } > > > > > > -static inline void *memblock_alloc_from(phys_addr_t size, > > > +static __always_inline void *memblock_alloc_from(phys_addr_t size, > > > phys_addr_t align, > > > phys_addr_t min_addr) > > > > I'm curious why from all memblock_alloc* wrappers this is the only one that > > needs to be __always_inline? > > Thread-merge[1], adding Will Deacon, who was kind of asking the same > question. > > Based on what I can tell, GCC has kind of fragile inlining logic, in the > sense that it can change whether or not it inlines something based on > optimizations. It looks like the kcov instrumentation being added (or in > this case, removed) from a function changes the optimization results, > and some functions marked "inline" are _not_ inlined. In that case, we end up > with __init code calling a function not marked __init, and we get the > build warnings I'm trying to eliminate. > > So, to Will's comment, yes, the problem is somewhat fragile (though > using either __always_inline or __init will deterministically solve it). > We've tripped over this before with GCC and the solution has usually > been to just use __always_inline and move on. > > For memblock_alloc*, it appears to be that the heuristic GCC uses > resulted in only memblock_alloc_from() being a problem in this case. I > can certainly mark them all as __always_inline if that is preferred. We had a few of those already converted to __always_inline, so I'm ok with continuing to fix them one at at time. Gives a feeling of job security ;-) > -- > Kees Cook -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-07-22 13:29 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20250717231756.make.423-kees@kernel.org> 2025-07-17 23:25 ` [PATCH v3 04/13] x86: Handle KCOV __init vs inline mismatches Kees Cook 2025-07-18 8:36 ` Mike Rapoport 2025-07-18 22:51 ` Kees Cook 2025-07-20 6:10 ` Ard Biesheuvel 2025-07-21 12:47 ` Will Deacon 2025-07-21 20:14 ` Kees Cook 2025-07-21 20:49 ` Kees Cook 2025-07-22 6:55 ` Ard Biesheuvel 2025-07-22 13:29 ` Will Deacon 2025-07-22 8:26 ` Mike Rapoport
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).