Commit 357b4da5 authored by Juergen Gross's avatar Juergen Gross

x86: respect memory size limiting via mem= parameter

When limiting memory size via kernel parameter "mem=" this should be
respected even in case of memory made accessible via a PCI card.

Today this kind of memory won't be made usable in initial memory
setup as the memory won't be visible in E820 map, but it might be
added when adding PCI devices due to corresponding ACPI table entries.

Not respecting "mem=" can be corrected by adding a global max_mem_size
variable set by parse_memopt() which will result in rejecting adding
memory areas resulting in a memory size above the allowed limit.
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
Acked-by: default avatarIngo Molnar <mingo@kernel.org>
Reviewed-by: default avatarWilliam Kucharski <william.kucharski@oracle.com>
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
parent 068e79f4
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/firmware-map.h> #include <linux/firmware-map.h>
#include <linux/sort.h> #include <linux/sort.h>
#include <linux/memory_hotplug.h>
#include <asm/e820/api.h> #include <asm/e820/api.h>
#include <asm/setup.h> #include <asm/setup.h>
...@@ -881,6 +882,10 @@ static int __init parse_memopt(char *p) ...@@ -881,6 +882,10 @@ static int __init parse_memopt(char *p)
e820__range_remove(mem_size, ULLONG_MAX - mem_size, E820_TYPE_RAM, 1); e820__range_remove(mem_size, ULLONG_MAX - mem_size, E820_TYPE_RAM, 1);
#ifdef CONFIG_MEMORY_HOTPLUG
max_mem_size = mem_size;
#endif
return 0; return 0;
} }
early_param("mem", parse_memopt); early_param("mem", parse_memopt);
......
...@@ -100,6 +100,8 @@ extern void __online_page_free(struct page *page); ...@@ -100,6 +100,8 @@ extern void __online_page_free(struct page *page);
extern int try_online_node(int nid); extern int try_online_node(int nid);
extern u64 max_mem_size;
extern bool memhp_auto_online; extern bool memhp_auto_online;
/* If movable_node boot option specified */ /* If movable_node boot option specified */
extern bool movable_node_enabled; extern bool movable_node_enabled;
......
...@@ -96,10 +96,16 @@ void mem_hotplug_done(void) ...@@ -96,10 +96,16 @@ void mem_hotplug_done(void)
cpus_read_unlock(); cpus_read_unlock();
} }
u64 max_mem_size = U64_MAX;
/* add this memory to iomem resource */ /* add this memory to iomem resource */
static struct resource *register_memory_resource(u64 start, u64 size) static struct resource *register_memory_resource(u64 start, u64 size)
{ {
struct resource *res, *conflict; struct resource *res, *conflict;
if (start + size > max_mem_size)
return ERR_PTR(-E2BIG);
res = kzalloc(sizeof(struct resource), GFP_KERNEL); res = kzalloc(sizeof(struct resource), GFP_KERNEL);
if (!res) if (!res)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment