diff --git a/include/linux/page_ext.h b/include/linux/page_ext.h index e01df4271585..00e8988e5a84 100644 --- a/include/linux/page_ext.h +++ b/include/linux/page_ext.h @@ -44,8 +44,12 @@ static inline void page_ext_init_flatmem(void) { } extern void page_ext_init(void); +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) { } @@ -69,6 +73,10 @@ static inline void page_ext_init(void) { } +static inline void page_ext_init_flatmem_late(void) +{ +} + static inline void page_ext_init_flatmem(void) { } diff --git a/init/main.c b/init/main.c index 7942ad3cdb42..ed884e3dfb3b 100644 --- a/init/main.c +++ b/init/main.c @@ -541,6 +541,8 @@ static void __init mm_init(void) page_ext_init_flatmem(); report_meminit(); mem_init(); + /* page_owner must be initialized after buddy is ready */ + page_ext_init_flatmem_late(); kmem_cache_init(); pgtable_init(); vmalloc_init(); diff --git a/mm/page_ext.c b/mm/page_ext.c index aad120123688..9e7f56e45b5a 100644 --- a/mm/page_ext.c +++ b/mm/page_ext.c @@ -102,6 +102,13 @@ static void __init invoke_init_callbacks(void) } } +#if !defined(CONFIG_SPARSEMEM) +void __init page_ext_init_flatmem_late(void) +{ + invoke_init_callbacks(); +} +#endif + static unsigned long get_entry_size(void) { return sizeof(struct page_ext) + extra_mem; @@ -185,7 +192,6 @@ void __init page_ext_init_flatmem(void) goto fail; } pr_info("allocated %ld bytes of page_ext\n", total_usage); - invoke_init_callbacks(); return; fail: