>From 7f414aef1e84c8ff65102e571f808f6362212350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= Date: Fri, 7 Apr 2017 12:51:20 -0400 Subject: [PATCH] mm/memory_hotplug: add add_pages() hotplug without linear mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For some memory hotplug we do not want the linear mapping to the hotpluged physical range. Add a new helper that just do __add_pages() and other arch specific bits if necessary. Signed-off-by: Jérôme Glisse --- arch/x86/Kconfig | 1 + arch/x86/mm/init_64.c | 17 ++++++++++++++++- mm/Kconfig | 2 ++ mm/memory_hotplug.c | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index cc98d5a..4024fee 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -25,6 +25,7 @@ config X86_64 select ARCH_HAS_GIGANTIC_PAGE select ARCH_SUPPORTS_INT128 select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_HAS_ADD_PAGES select HAVE_ARCH_SOFT_DIRTY select MODULES_USE_ELF_RELA select X86_DEV_DMA_OPS diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 15173d3..933032c 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -626,7 +626,7 @@ void __init paging_init(void) * After memory hotplug the variables max_pfn, max_low_pfn and high_memory need * updating. */ -static void update_end_of_memory_vars(u64 start, u64 size) +static void update_end_of_memory_vars(u64 start, u64 size) { unsigned long end_pfn = PFN_UP(start + size); @@ -662,6 +662,21 @@ int arch_add_memory(int nid, u64 start, u64 size, bool for_device) } EXPORT_SYMBOL_GPL(arch_add_memory); +int add_pages(int nid, struct zone *zone, unsigned long phys_start_pfn, + unsigned long nr_pages) +{ + int ret; + + ret = __add_pages(nid, zone, phys_start_pfn, nr_pages); + + if (!ret) + update_end_of_memory_vars(phys_start_pfn << PAGE_SHIFT, + nr_pages << PAGE_SHIFT); + + return ret; +} +EXPORT_SYMBOL_GPL(add_pages); + #define PAGE_INUSE 0xFD static void __meminit free_pagetable(struct page *page, int order) diff --git a/mm/Kconfig b/mm/Kconfig index 9b8fccb..d052ec1 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -707,3 +707,5 @@ config ARCH_USES_HIGH_VMA_FLAGS bool config ARCH_HAS_PKEYS bool +config ARCH_HAS_ADD_PAGES + bool diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 295479b..bef772c 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -576,6 +576,24 @@ int __ref __add_pages(int nid, struct zone *zone, unsigned long phys_start_pfn, } EXPORT_SYMBOL_GPL(__add_pages); +#ifndef ARCH_HAS_ADD_PAGES +int add_pages(int nid, struct zone *zone, unsigned long phys_start_pfn, + unsigned long nr_pages) +{ + int ret; + + ret = __add_pages(nid, zone, phys_start_pfn, nr_pages); + +#ifdef CONFIG_X86_64 + if (!ret) + update_end_of_memory_vars(phys_start_pfn << PAGE_SHIFT, + nr_pages << PAGE_SHIFT); +#endif + return ret; +} +EXPORT_SYMBOL_GPL(add_pages); +#endif /* ARCH_HAS_ADD_PAGES */ + #ifdef CONFIG_MEMORY_HOTREMOVE /* find the smallest valid pfn in the range [start_pfn, end_pfn) */ static int find_smallest_section_pfn(int nid, struct zone *zone, -- 2.7.4