|
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 |
|