On Fri, Nov 28, 2025 at 4:33 AM Baoquan He <[email protected]> wrote: > > This allows generic and sw_tags to be set in kernel cmdline too. > > When at it, rename 'kasan_arg' to 'kasan_arg_disabled' as a bool > variable. And expose 'kasan_flag_enabled' to kasan common place > too.
This asks to be two separate patches. > > This is prepared for later adding kernel parameter kasan=on|off for > all three kasan modes. > > Signed-off-by: Baoquan He <[email protected]> > --- > include/linux/kasan-enabled.h | 4 +++- > mm/kasan/common.c | 20 ++++++++++++++++++-- > mm/kasan/hw_tags.c | 28 ++-------------------------- > 3 files changed, 23 insertions(+), 29 deletions(-) > > diff --git a/include/linux/kasan-enabled.h b/include/linux/kasan-enabled.h > index 9eca967d8526..b05ec6329fbe 100644 > --- a/include/linux/kasan-enabled.h > +++ b/include/linux/kasan-enabled.h > @@ -4,13 +4,15 @@ > > #include <linux/static_key.h> > > -#if defined(CONFIG_ARCH_DEFER_KASAN) || defined(CONFIG_KASAN_HW_TAGS) These changes of moving/removing CONFIG_ARCH_DEFER_KASAN also seem to belong to a separate patch (or should be combined with patch 12?); the commit message does not even mention them. > +extern bool kasan_arg_disabled; > + > /* > * Global runtime flag for KASAN modes that need runtime control. > * Used by ARCH_DEFER_KASAN architectures and HW_TAGS mode. > */ > DECLARE_STATIC_KEY_FALSE(kasan_flag_enabled); So kasan_flag_enabled is now always exposed here... > > +#if defined(CONFIG_ARCH_DEFER_KASAN) || defined(CONFIG_KASAN_HW_TAGS) but the functions that use it are not. Why? > /* > * Runtime control for shadow memory initialization or HW_TAGS mode. > * Uses static key for architectures that need deferred KASAN or HW_TAGS. > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index 1d27f1bd260b..ac14956986ee 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -32,14 +32,30 @@ > #include "kasan.h" > #include "../slab.h" > > -#if defined(CONFIG_ARCH_DEFER_KASAN) || defined(CONFIG_KASAN_HW_TAGS) > /* > * Definition of the unified static key declared in kasan-enabled.h. > * This provides consistent runtime enable/disable across KASAN modes. > */ > DEFINE_STATIC_KEY_FALSE(kasan_flag_enabled); > EXPORT_SYMBOL_GPL(kasan_flag_enabled); > -#endif > + > +bool kasan_arg_disabled __ro_after_init; > +/* kasan=off/on */ > +static int __init early_kasan_flag(char *arg) > +{ > + if (!arg) > + return -EINVAL; > + > + if (!strcmp(arg, "off")) > + kasan_arg_disabled = true; > + else if (!strcmp(arg, "on")) > + kasan_arg_disabled = false; > + else > + return -EINVAL; > + > + return 0; > +} > +early_param("kasan", early_kasan_flag); > > struct slab *kasan_addr_to_slab(const void *addr) > { > diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c > index 1c373cc4b3fa..709c91abc1b1 100644 > --- a/mm/kasan/hw_tags.c > +++ b/mm/kasan/hw_tags.c > @@ -22,12 +22,6 @@ > > #include "kasan.h" > > -enum kasan_arg { > - KASAN_ARG_DEFAULT, > - KASAN_ARG_OFF, > - KASAN_ARG_ON, > -}; > - > enum kasan_arg_mode { > KASAN_ARG_MODE_DEFAULT, > KASAN_ARG_MODE_SYNC, > @@ -41,7 +35,6 @@ enum kasan_arg_vmalloc { > KASAN_ARG_VMALLOC_ON, > }; > > -static enum kasan_arg kasan_arg __ro_after_init; > static enum kasan_arg_mode kasan_arg_mode __ro_after_init; > static enum kasan_arg_vmalloc kasan_arg_vmalloc __initdata; > > @@ -81,23 +74,6 @@ unsigned int kasan_page_alloc_sample_order = > PAGE_ALLOC_SAMPLE_ORDER_DEFAULT; > > DEFINE_PER_CPU(long, kasan_page_alloc_skip); > > -/* kasan=off/on */ > -static int __init early_kasan_flag(char *arg) > -{ > - if (!arg) > - return -EINVAL; > - > - if (!strcmp(arg, "off")) > - kasan_arg = KASAN_ARG_OFF; > - else if (!strcmp(arg, "on")) > - kasan_arg = KASAN_ARG_ON; > - else > - return -EINVAL; > - > - return 0; > -} > -early_param("kasan", early_kasan_flag); > - > /* kasan.mode=sync/async/asymm */ > static int __init early_kasan_mode(char *arg) > { > @@ -222,7 +198,7 @@ void kasan_init_hw_tags_cpu(void) > * When this function is called, kasan_flag_enabled is not yet > * set by kasan_init_hw_tags(). Thus, check kasan_arg instead. > */ > - if (kasan_arg == KASAN_ARG_OFF) > + if (kasan_arg_disabled) > return; > > /* > @@ -240,7 +216,7 @@ void __init kasan_init_hw_tags(void) > return; > > /* If KASAN is disabled via command line, don't initialize it. */ > - if (kasan_arg == KASAN_ARG_OFF) > + if (kasan_arg_disabled) > return; > > switch (kasan_arg_mode) { > -- > 2.41.0 >
