
From: Nikita Panov <panov.nikita@huawei.com> kunpeng inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IBOJU2 ------------------------------------------------- Acked-by: Artem Kuzin <artem.kuzin@huawei.com> Acked-by: Alexander Grubnikov <alexander.grubnikov@huawei.com> Acked-by: Ilya Hanov <ilya.hanov@huawei-partners.com> Acked-by: Denis Darvish <darvish.denis@huawei.com> Signed-off-by: Nikita Panov <panov.nikita@huawei.com> --- include/linux/mm.h | 3 +++ init/main.c | 17 +++++++++++++++++ mm/mm_init.c | 3 +++ 3 files changed, 23 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index 49d7e2b2cdff..f706eed1a8b5 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3363,6 +3363,9 @@ extern int __meminit early_pfn_to_nid(unsigned long pfn); extern void set_dma_reserve(unsigned long new_dma_reserve); extern void mem_init(void); +#ifdef CONFIG_KERNEL_REPLICATION +extern void preallocate_vmalloc_pages(void); +#endif extern void __init mmap_init(void); extern void __show_mem(unsigned int flags, nodemask_t *nodemask, int max_zone_idx); diff --git a/init/main.c b/init/main.c index 8fdfa69dba0f..c74606c30a82 100644 --- a/init/main.c +++ b/init/main.c @@ -100,6 +100,7 @@ #include <linux/init_syscalls.h> #include <linux/stackdepot.h> #include <linux/randomize_kstack.h> +#include <linux/numa_kernel_replication.h> #include <net/net_namespace.h> #include <asm/io.h> @@ -928,11 +929,19 @@ void start_kernel(void) * These use large bootmem allocations and must precede * initalization of page allocator */ + numa_replication_init(); setup_log_buf(0); vfs_caches_init_early(); sort_main_extable(); trap_init(); mm_core_init(); + /* + * Kernel text replication should be done before + * alloc/init first mm struct, due to it is necessary + * to setup per-NUMA node translation tables and kernel + * instances properly. + */ + numa_replicate_kernel_text(); poking_init(); ftrace_init(); @@ -1455,6 +1464,14 @@ static int __ref kernel_init(void *unused) free_initmem(); mark_readonly(); + /* + * RODATA replication is done here due to + * it is necessary to finalize the kernel + * and modules initialization before + */ + numa_replicate_kernel_rodata(); + numa_replication_fini(); + /* * Kernel mappings are now finalized - update the userspace page-table * to finalize PTI. diff --git a/mm/mm_init.c b/mm/mm_init.c index 0a3c20a00318..72fc5f972d36 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -2819,6 +2819,9 @@ void __init mm_core_init(void) ptlock_cache_init(); pgtable_cache_init(); debug_objects_mem_init(); +#ifdef CONFIG_KERNEL_REPLICATION + preallocate_vmalloc_pages(); +#endif vmalloc_init(); /* If no deferred init page_ext now, as vmap is fully initialized */ if (!deferred_struct_pages) -- 2.34.1