Juergen Gross 2f3598
From: Juergen Gross <jgross@suse.com>
Juergen Gross 2f3598
Date: Thu, 14 Feb 2019 11:42:39 +0100
Juergen Gross 2f3598
Patch-mainline: Queued in subsystem maintainer repository
Juergen Gross 2f3598
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git
Juergen Gross 2f3598
Git-commit: 357b4da50a62e2fd70eacee21cdbd22d4c7a7b60
Juergen Gross 2f3598
References: bsc#1117645
Juergen Gross 2f3598
Subject: x86: respect memory size limiting via mem= parameter
Juergen Gross 2f3598
Juergen Gross 2f3598
When limiting memory size via kernel parameter "mem=" this should be
Juergen Gross 2f3598
respected even in case of memory made accessible via a PCI card.
Juergen Gross 2f3598
Juergen Gross 2f3598
Today this kind of memory won't be made usable in initial memory
Juergen Gross 2f3598
setup as the memory won't be visible in E820 map, but it might be
Juergen Gross 2f3598
added when adding PCI devices due to corresponding ACPI table entries.
Juergen Gross 2f3598
Juergen Gross 2f3598
Not respecting "mem=" can be corrected by adding a global max_mem_size
Juergen Gross 2f3598
variable set by parse_memopt() which will result in rejecting adding
Juergen Gross 2f3598
memory areas resulting in a memory size above the allowed limit.
Juergen Gross 2f3598
Juergen Gross 2f3598
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 2f3598
Acked-by: Ingo Molnar <mingo@kernel.org>
Juergen Gross 2f3598
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
Juergen Gross 2f3598
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 2f3598
---
Juergen Gross 2f3598
 arch/x86/kernel/e820.c         | 5 +++++
Juergen Gross 2f3598
 include/linux/memory_hotplug.h | 2 ++
Juergen Gross 2f3598
 mm/memory_hotplug.c            | 6 ++++++
Juergen Gross 2f3598
 3 files changed, 13 insertions(+)
Juergen Gross 2f3598
Juergen Gross 2f3598
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
Juergen Gross 2f3598
index 50895c2f937d..e67513e2cbbb 100644
Juergen Gross 2f3598
--- a/arch/x86/kernel/e820.c
Juergen Gross 2f3598
+++ b/arch/x86/kernel/e820.c
Juergen Gross 2f3598
@@ -15,6 +15,7 @@
Juergen Gross 2f3598
 #include <linux/firmware-map.h>
Juergen Gross 2f3598
 #include <linux/memblock.h>
Juergen Gross 2f3598
 #include <linux/sort.h>
Juergen Gross 2f3598
+#include <linux/memory_hotplug.h>
Juergen Gross 2f3598
 
Juergen Gross 2f3598
 #include <asm/e820/api.h>
Juergen Gross 2f3598
 #include <asm/setup.h>
Juergen Gross 2f3598
@@ -859,6 +860,10 @@ static int __init parse_memopt(char *p)
Juergen Gross 2f3598
 
Juergen Gross 2f3598
 	e820__range_remove(mem_size, ULLONG_MAX - mem_size, E820_TYPE_RAM, 1);
Juergen Gross 2f3598
 
Juergen Gross 2f3598
+#ifdef CONFIG_MEMORY_HOTPLUG
Juergen Gross 2f3598
+	max_mem_size = mem_size;
Juergen Gross 2f3598
+#endif
Juergen Gross 2f3598
+
Juergen Gross 2f3598
 	return 0;
Juergen Gross 2f3598
 }
Juergen Gross 2f3598
 early_param("mem", parse_memopt);
Juergen Gross 2f3598
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
Juergen Gross 2f3598
index 368267c1b71b..cfd12078172a 100644
Juergen Gross 2f3598
--- a/include/linux/memory_hotplug.h
Juergen Gross 2f3598
+++ b/include/linux/memory_hotplug.h
Juergen Gross 2f3598
@@ -114,6 +114,8 @@ extern void __online_page_free(struct page *page);
Juergen Gross 2f3598
 
Juergen Gross 2f3598
 extern int try_online_node(int nid);
Juergen Gross 2f3598
 
Juergen Gross 2f3598
+extern u64 max_mem_size;
Juergen Gross 2f3598
+
Juergen Gross 2f3598
 extern bool memhp_auto_online;
Juergen Gross 2f3598
 
Juergen Gross 2f3598
 #ifdef CONFIG_MEMORY_HOTREMOVE
Juergen Gross 2f3598
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
Juergen Gross 2f3598
index 124e794867c5..519f9db063ff 100644
Juergen Gross 2f3598
--- a/mm/memory_hotplug.c
Juergen Gross 2f3598
+++ b/mm/memory_hotplug.c
Juergen Gross 2f3598
@@ -156,10 +156,16 @@ void mem_hotplug_done(void)
Juergen Gross 2f3598
 	mutex_unlock(&memory_add_remove_lock);
Juergen Gross 2f3598
 }
Juergen Gross 2f3598
 
Juergen Gross 2f3598
+u64 max_mem_size = U64_MAX;
Juergen Gross 2f3598
+
Juergen Gross 2f3598
 /* add this memory to iomem resource */
Juergen Gross 2f3598
 static struct resource *register_memory_resource(u64 start, u64 size)
Juergen Gross 2f3598
 {
Juergen Gross 2f3598
 	struct resource *res, *conflict;
Juergen Gross 2f3598
+
Juergen Gross 2f3598
+	if (start + size > max_mem_size)
Juergen Gross 2f3598
+		return ERR_PTR(-E2BIG);
Juergen Gross 2f3598
+
Juergen Gross 2f3598
 	res = kzalloc(sizeof(struct resource), GFP_KERNEL);
Juergen Gross 2f3598
 	if (!res)
Juergen Gross 2f3598
 		return ERR_PTR(-ENOMEM);
Juergen Gross 2f3598
-- 
Juergen Gross 2f3598
2.16.4
Juergen Gross 2f3598