On 2022-08-24 8:09 UTC, mhocko@xxxxxxxx wrote: >On Wed 24-08-22 14:50:58, lizhe.67@xxxxxxxxxxxxx wrote: >[...] >> diff --git a/include/linux/page_ext.h b/include/linux/page_ext.h >> index fabb2e1e087f..3e081cf8a1ec 100644 >> --- a/include/linux/page_ext.h >> +++ b/include/linux/page_ext.h >> @@ -38,19 +38,22 @@ struct page_ext { >> >> extern unsigned long page_ext_size; >> extern void pgdat_page_ext_init(struct pglist_data *pgdat); >> +#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT >> +extern bool early_page_ext_enable(void); >> +#endif >> >> #ifdef CONFIG_SPARSEMEM >> static inline void page_ext_init_flatmem(void) >> { >> } >> -extern void page_ext_init(void); >> +extern void page_ext_init(bool early); >> static inline void page_ext_init_flatmem_late(void) >> { >> } >> #else >> extern void page_ext_init_flatmem(void); >> extern void page_ext_init_flatmem_late(void); >> -static inline void page_ext_init(void) >> +static inline void page_ext_init(bool early) >> { >> } >> #endif > >Why do you need to make it CONFIG_DEFERRED_STRUCT_PAGE_INIT >dependant? Yes it is unnecessary. Thanks! >[...] >> diff --git a/init/main.c b/init/main.c >> index 91642a4e69be..3760c0326525 100644 >> --- a/init/main.c >> +++ b/init/main.c >> @@ -849,6 +849,8 @@ static void __init mm_init(void) >> pgtable_init(); >> debug_objects_mem_init(); >> vmalloc_init(); >> + /* Should be run after vmap initialization */ >> + page_ext_init(true); > >you can just > if (early_page_ext) > page_ext_init(); > >> /* Should be run before the first non-init thread is created */ >> init_espfix_bsp(); >> /* Should be run after espfix64 is set up. */ >> @@ -1606,7 +1608,7 @@ static noinline void __init kernel_init_freeable(void) >> padata_init(); >> page_alloc_init_late(); >> /* Initialize page ext after all struct pages are initialized. */ >> - page_ext_init(); >> + page_ext_init(false); > > if (!early_page_ext) > page_ext_init(); I think we can use an inline function instead of 'early_page_ext' here. The reason is that if CONFIG_PAGE_EXTENSION=n, 'early_page_ext' is undefined. Thought we can #define early_page_ext as false, it is ugly. >> >> do_basic_setup(); >> > >and without the ifdefery it all becomes much more simple. Yes it becomes much more simple. Thanks for all your advices! I will take your advices and send a v3 patch.