Skip to content

Commit 8245d47

Browse files
committed
x86: Handle KCOV __init vs inline mismatches
GCC appears to have kind of fragile inlining heuristics, 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 in the coming patch that adds __no_sanitize_coverage to __init functions: WARNING: modpost: vmlinux: section mismatch in reference: xbc_exit+0x8 (section: .text.unlikely) -> _xbc_exit (section: .init.text) WARNING: modpost: vmlinux: section mismatch in reference: real_mode_size_needed+0x15 (section: .text.unlikely) -> real_mode_blob_end (section: .init.data) WARNING: modpost: vmlinux: section mismatch in reference: __set_percpu_decrypted+0x16 (section: .text.unlikely) -> early_set_memory_decrypted (section: .init.text) WARNING: modpost: vmlinux: section mismatch in reference: memblock_alloc_from+0x26 (section: .text.unlikely) -> memblock_alloc_try_nid (section: .init.text) WARNING: modpost: vmlinux: section mismatch in reference: acpi_arch_set_root_pointer+0xc (section: .text.unlikely) -> x86_init (section: .init.data) WARNING: modpost: vmlinux: section mismatch in reference: acpi_arch_get_root_pointer+0x8 (section: .text.unlikely) -> x86_init (section: .init.data) WARNING: modpost: vmlinux: section mismatch in reference: efi_config_table_is_usable+0x16 (section: .text.unlikely) -> xen_efi_config_table_is_usable (section: .init.text) This problem is somewhat fragile (though using either __always_inline or __init will deterministically solve it), but we've tripped over this before with GCC and the solution has usually been to just use __always_inline and move on. For x86 this means forcing several functions to be inline with __always_inline. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Kees Cook <[email protected]>
1 parent 65c4309 commit 8245d47

File tree

10 files changed

+13
-13
lines changed

10 files changed

+13
-13
lines changed

arch/x86/include/asm/acpi.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,13 @@ static inline bool acpi_has_cpu_in_madt(void)
158158
}
159159

160160
#define ACPI_HAVE_ARCH_SET_ROOT_POINTER
161-
static inline void acpi_arch_set_root_pointer(u64 addr)
161+
static __always_inline void acpi_arch_set_root_pointer(u64 addr)
162162
{
163163
x86_init.acpi.set_root_pointer(addr);
164164
}
165165

166166
#define ACPI_HAVE_ARCH_GET_ROOT_POINTER
167-
static inline u64 acpi_arch_get_root_pointer(void)
167+
static __always_inline u64 acpi_arch_get_root_pointer(void)
168168
{
169169
return x86_init.acpi.get_root_pointer();
170170
}

arch/x86/include/asm/realmode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extern unsigned char secondary_startup_64[];
7878
extern unsigned char secondary_startup_64_no_verify[];
7979
#endif
8080

81-
static inline size_t real_mode_size_needed(void)
81+
static __always_inline size_t real_mode_size_needed(void)
8282
{
8383
if (real_mode_header)
8484
return 0; /* already allocated. */

arch/x86/kernel/kvm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ static u64 kvm_steal_clock(int cpu)
420420
return steal;
421421
}
422422

423-
static inline void __set_percpu_decrypted(void *ptr, unsigned long size)
423+
static inline __init void __set_percpu_decrypted(void *ptr, unsigned long size)
424424
{
425425
early_set_memory_decrypted((unsigned long) ptr, size);
426426
}

arch/x86/mm/init_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ kernel_physical_mapping_change(unsigned long paddr_start,
806806
}
807807

808808
#ifndef CONFIG_NUMA
809-
static inline void x86_numa_init(void)
809+
static __always_inline void x86_numa_init(void)
810810
{
811811
memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0);
812812
}

include/linux/acpi.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -759,13 +759,13 @@ int acpi_arch_timer_mem_init(struct arch_timer_mem *timer_mem, int *timer_count)
759759
#endif
760760

761761
#ifndef ACPI_HAVE_ARCH_SET_ROOT_POINTER
762-
static inline void acpi_arch_set_root_pointer(u64 addr)
762+
static __always_inline void acpi_arch_set_root_pointer(u64 addr)
763763
{
764764
}
765765
#endif
766766

767767
#ifndef ACPI_HAVE_ARCH_GET_ROOT_POINTER
768-
static inline u64 acpi_arch_get_root_pointer(void)
768+
static __always_inline u64 acpi_arch_get_root_pointer(void)
769769
{
770770
return 0;
771771
}

include/linux/bootconfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ int __init xbc_get_info(int *node_size, size_t *data_size);
290290
/* XBC cleanup data structures */
291291
void __init _xbc_exit(bool early);
292292

293-
static inline void xbc_exit(void)
293+
static __always_inline void xbc_exit(void)
294294
{
295295
_xbc_exit(false);
296296
}

include/linux/efi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,7 @@ struct linux_efi_initrd {
13341334

13351335
bool xen_efi_config_table_is_usable(const efi_guid_t *guid, unsigned long table);
13361336

1337-
static inline
1337+
static __always_inline
13381338
bool efi_config_table_is_usable(const efi_guid_t *guid, unsigned long table)
13391339
{
13401340
if (!IS_ENABLED(CONFIG_XEN_EFI))

include/linux/memblock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ static inline void *memblock_alloc_raw(phys_addr_t size,
463463
NUMA_NO_NODE);
464464
}
465465

466-
static inline void *memblock_alloc_from(phys_addr_t size,
466+
static __always_inline void *memblock_alloc_from(phys_addr_t size,
467467
phys_addr_t align,
468468
phys_addr_t min_addr)
469469
{

include/linux/smp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static inline void wake_up_all_idle_cpus(void) { }
221221

222222
#ifdef CONFIG_UP_LATE_INIT
223223
extern void __init up_late_init(void);
224-
static inline void smp_init(void) { up_late_init(); }
224+
static __always_inline void smp_init(void) { up_late_init(); }
225225
#else
226226
static inline void smp_init(void) { }
227227
#endif

kernel/kexec_handover.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,8 @@ static int kho_mem_serialize(struct kho_serialization *ser)
305305
return -ENOMEM;
306306
}
307307

308-
static void deserialize_bitmap(unsigned int order,
309-
struct khoser_mem_bitmap_ptr *elm)
308+
static void __init deserialize_bitmap(unsigned int order,
309+
struct khoser_mem_bitmap_ptr *elm)
310310
{
311311
struct kho_mem_phys_bits *bitmap = KHOSER_LOAD_PTR(elm->bitmap);
312312
unsigned long bit;

0 commit comments

Comments
 (0)