[PATCH] mm/memory_hotplug: add add_pages() hotplug without linear mapping

From: JÃrÃme Glisse
Date: Fri Apr 07 2017 - 12:51:20 EST


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éme Glisse <jglisse@xxxxxxxxxx>
---
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


--envbJBWh7q8WU6mo--