On Wed, Jun 25, 2025 at 3:35 PM Christophe Leroy <christophe.le...@csgroup.eu> wrote: > > > > Le 25/06/2025 à 11:52, Sabyrzhan Tasbolatov a écrit : > > Historically the fast-path static key `kasan_flag_enabled` existed > > only for `CONFIG_KASAN_HW_TAGS`. Generic and SW_TAGS either relied on > > `kasan_arch_is_ready()` or evaluated KASAN checks unconditionally. > > As a result every architecture had to toggle a private flag > > in its `kasan_init()`. > > > > This patch turns the flag into a single global runtime predicate that > > is built for every `CONFIG_KASAN` mode and adds a helper that flips > > the key once KASAN is ready. > > Shouldn't kasan_init_generic() also perform the following line to reduce > even more code duplication between architectures ? > > init_task.kasan_depth = 0;
I've tried to introduce a new function kasan_mark_ready() to gather all arch duplicated code in one place: In mm/kasan/common.c: void __init kasan_mark_ready(void) { /* Enable error reporting */ init_task.kasan_depth = 0; /* Mark KASAN as ready */ static_branch_enable(&kasan_flag_enabled); } So we could've called it in mm/kasan/generic.c: void __init kasan_init_generic(void) { kasan_mark_ready(); pr_info("KernelAddressSanitizer initialized (generic)\n"); } in mm/kasan/sw_tags.c: void __init kasan_init_sw_tags(void) { ... kasan_mark_ready(); pr_info("KernelAddressSanitizer initialized .."); } in mm/kasan/hw_tags.c: void __init kasan_init_hw_tags(void) { ... kasan_mark_ready(); pr_info("KernelAddressSanitizer initialized .."); } But it works only for CONFIG_KASAN_GENERIC mode, when arch code calls kasan_init(), for example, arm64: void __init kasan_init(void) { kasan_init_shadow(); kasan_init_generic(); } And for HW_TAGS, SW_TAGS it won't work. Fails during compiling: mm/kasan/common.c:45:12: error: no member named 'kasan_depth' in 'struct task_struct' 45 | init_task.kasan_depth = 0; because kasan_init_sw_tags(), kasan_init_hw_tags() are called once on CPU boot. For arm64, where these KASAN modes are supported, both functions are called in smp_prepare_boot_cpu(). So I guess, every arch kasan_init() has to set in kasan_init() init_task.kasan_depth = 0; to enable error messages before switching KASAN readiness via enabling kasan_flag_enabled key. > > Christophe >