On 9/16/19 5:57 PM, Andrey Ryabinin wrote: >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -710,8 +710,12 @@ static int __init early_debug_pagealloc(char *buf) >> if (kstrtobool(buf, &enable)) >> return -EINVAL; >> >> - if (enable) >> + if (enable) { >> static_branch_enable(&_debug_pagealloc_enabled); >> +#ifdef CONFIG_PAGE_OWNER >> + page_owner_free_stack_disabled = false; > > I think this won't work with CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT=y Good point, thanks. >> +#endif >> + } >> >> return 0; >> } >> diff --git a/mm/page_owner.c b/mm/page_owner.c >> index dee931184788..b589bfbc4795 100644 >> --- a/mm/page_owner.c >> +++ b/mm/page_owner.c >> @@ -24,13 +24,15 @@ struct page_owner { >> short last_migrate_reason; >> gfp_t gfp_mask; >> depot_stack_handle_t handle; >> -#ifdef CONFIG_DEBUG_PAGEALLOC >> +#ifdef CONFIG_PAGE_OWNER_FREE_STACK >> depot_stack_handle_t free_handle; >> #endif >> }; >> >> static bool page_owner_disabled = true; >> +bool page_owner_free_stack_disabled = true; >> DEFINE_STATIC_KEY_FALSE(page_owner_inited); >> +static DEFINE_STATIC_KEY_FALSE(page_owner_free_stack); >> >> static depot_stack_handle_t dummy_handle; >> static depot_stack_handle_t failure_handle; >> @@ -46,6 +48,9 @@ static int __init early_page_owner_param(char *buf) >> if (strcmp(buf, "on") == 0) >> page_owner_disabled = false; >> >> + if (!page_owner_disabled && IS_ENABLED(CONFIG_KASAN)) > > I'd rather keep all logic in one place, i.e. "if (!page_owner_disabled && (IS_ENABLED(CONFIG_KASAN) || debug_pagealloc_enabled())" > With this no changes in early_debug_pagealloc() required and CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT=y should also work correctly. In this function it would not work if the debug_pagealloc param gets processed later than page_owner, but should be doable in init_page_owner(), I'll try, thanks. > >> + page_owner_free_stack_disabled = false; >> + >> return 0; >> } >> early_param("page_owner", early_page_owner_param); > >