This patch series addresses the fragmentation in KASAN initialization across architectures by introducing a unified approach that eliminates duplicate static keys and arch-specific kasan_arch_is_ready() implementations.
The core issue is that different architectures have inconsistent approaches to KASAN readiness tracking: - PowerPC, LoongArch, and UML arch, each implement own kasan_arch_is_ready() - Only HW_TAGS mode had a unified static key (kasan_flag_enabled) - Generic and SW_TAGS modes relied on arch-specific solutions or always-on behavior This series implements two-level approach: 1. kasan_enabled() - compile-time check for KASAN configuration 2. kasan_shadow_initialized() - runtime check for shadow memory readiness Changes in v4: - Unified patches where ARCH_DEFER_KASAN is introduced and used in the KASAN code (Andrey Ryabinin) - Fixed kasan_enable() for HW_TAGS mode (Andrey Ryabinin) - Replaced !kasan_enabled() with !kasan_shadow_initialized() in loongarch which selects ARCH_DEFER_KASAN (Andrey Ryabinin) - Addressed the issue in UML arch, where kasan_init_generic() is called before jump_label_init() (Andrey Ryabinin) Adding in TO additional recipients who developed KASAN in LoongArch, UML. Tested on: - powerpc - selects ARCH_DEFER_KASAN Built ppc64_defconfig (PPC_BOOK3S_64) - OK Booted via qemu-system-ppc64 - OK - um - selects ARCH_DEFER_KASAN Built defconfig with KASAN_INLINE - OK Built defconfig with STATIC_LINK && KASAN_OUTLINE - OK Booted ./linux - OK - loongarch - selects ARCH_DEFER_KASAN Built defconfig with KASAN_GENERIC - OK Haven't tested the boot. Asking Loongarch developers to verify - N/A But should be good, since Loongarch does not have specific "kasan_init()" call like UML does. It selects ARCH_DEFER_KASAN and calls kasan_init() in the end of setup_arch() after jump_label_init(). - arm64 Built defconfig, kvm_guest.config with HW_TAGS, SW_TAGS, GENERIC - OK KASAN_KUNIT_TEST - OK Booted via qemu-system-arm64 - OK - x86_64 Built defconfig, kvm_guest.config with KASAN_GENERIC - OK KASAN_KUNIT_TEST - OK Booted via qemu-system-x86 - OK - s390, riscv, xtensa, arm Built defconfig with KASAN_GENERIC - OK Previous v3 thread: https://lore.kernel.org/all/20250717142732.292822-1-snovit...@gmail.com/ Previous v2 thread: https://lore.kernel.org/all/20250626153147.145312-1-snovit...@gmail.com/ Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217049 Sabyrzhan Tasbolatov (9): kasan: introduce ARCH_DEFER_KASAN and unify static key across modes kasan/powerpc: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/arm,arm64: call kasan_init_generic in kasan_init kasan/xtensa: call kasan_init_generic in kasan_init kasan/loongarch: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/um: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/x86: call kasan_init_generic in kasan_init kasan/s390: call kasan_init_generic in kasan_init kasan/riscv: call kasan_init_generic in kasan_init arch/arm/mm/kasan_init.c | 2 +- arch/arm64/mm/kasan_init.c | 4 +-- arch/loongarch/Kconfig | 1 + arch/loongarch/include/asm/kasan.h | 7 ----- arch/loongarch/mm/kasan_init.c | 8 ++--- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/kasan.h | 12 -------- arch/powerpc/mm/kasan/init_32.c | 2 +- arch/powerpc/mm/kasan/init_book3e_64.c | 2 +- arch/powerpc/mm/kasan/init_book3s_64.c | 6 +--- arch/riscv/mm/kasan_init.c | 1 + arch/s390/kernel/early.c | 3 +- arch/um/Kconfig | 1 + arch/um/include/asm/kasan.h | 5 --- arch/um/kernel/mem.c | 12 ++++++-- arch/x86/mm/kasan_init_64.c | 2 +- arch/xtensa/mm/kasan_init.c | 2 +- include/linux/kasan-enabled.h | 36 +++++++++++++++++----- include/linux/kasan.h | 42 ++++++++++++++++++++------ lib/Kconfig.kasan | 8 +++++ mm/kasan/common.c | 18 +++++++---- mm/kasan/generic.c | 23 ++++++++------ mm/kasan/hw_tags.c | 9 +----- mm/kasan/kasan.h | 36 ++++++++++++++++------ mm/kasan/shadow.c | 32 +++++--------------- mm/kasan/sw_tags.c | 4 ++- mm/kasan/tags.c | 2 +- 27 files changed, 157 insertions(+), 124 deletions(-) -- 2.34.1