Messages in this thread Patch in this message |  | | From | Masayoshi Mizuma <> | Subject | [PATCH v6 1/3] x86/mm: Add a kernel parameter to change the padding used for the physical memory mapping | Date | Tue, 2 Oct 2018 21:33:21 -0400 |
| |
If each node of physical memory layout has huge space for hotplug, the padding used for the physical memory mapping section is not enough. For exapmle of the layout:
SRAT: Node 6 PXM 4 [mem 0x100000000000-0x13ffffffffff] hotplug SRAT: Node 7 PXM 5 [mem 0x140000000000-0x17ffffffffff] hotplug SRAT: Node 2 PXM 6 [mem 0x180000000000-0x1bffffffffff] hotplug SRAT: Node 3 PXM 7 [mem 0x1c0000000000-0x1fffffffffff] hotplug
We can increase the padding via CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING, however, the needed padding size depends on the system environment. The kernel option is better than changing the config.
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> Reviewed-by: Baoquan He <bhe@redhat.com> --- arch/x86/include/asm/setup.h | 9 +++++++++ arch/x86/mm/kaslr.c | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index ae13bc9..1765a15 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h @@ -80,6 +80,15 @@ static inline unsigned long kaslr_offset(void) return (unsigned long)&_text - __START_KERNEL; } +#ifdef CONFIG_RANDOMIZE_MEMORY +extern inline int __init get_rand_mem_physical_padding(void); +#else +static inline int __init get_rand_mem_physical_padding(void) +{ + return 0; +} +#endif + /* * Do NOT EVER look at the BIOS memory size location. * It does not work on many machines. diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c index 61db77b..eb47f05 100644 --- a/arch/x86/mm/kaslr.c +++ b/arch/x86/mm/kaslr.c @@ -40,6 +40,7 @@ */ static const unsigned long vaddr_end = CPU_ENTRY_AREA_BASE; +static int rand_mem_physical_padding __initdata = CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING; /* * Memory regions randomized by KASLR (except modules that use a separate logic * earlier during boot). The list is ordered based on virtual addresses. This @@ -69,6 +70,25 @@ static inline bool kaslr_memory_enabled(void) return kaslr_enabled() && !IS_ENABLED(CONFIG_KASAN); } +inline int __init get_rand_mem_physical_padding(void) +{ + return rand_mem_physical_padding; +} + +static int __init rand_mem_physical_padding_setup(char *str) +{ + int max_padding = (1 << (MAX_PHYSMEM_BITS - TB_SHIFT)) - 1; + + get_option(&str, &rand_mem_physical_padding); + if (rand_mem_physical_padding < 0) + rand_mem_physical_padding = 0; + else if (rand_mem_physical_padding > max_padding) + rand_mem_physical_padding = max_padding; + + return 0; +} +early_param("rand_mem_physical_padding", rand_mem_physical_padding_setup); + /* Initialize base and padding for each memory region randomized with KASLR */ void __init kernel_randomize_memory(void) { @@ -102,7 +122,7 @@ void __init kernel_randomize_memory(void) */ BUG_ON(kaslr_regions[0].base != &page_offset_base); memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) + - CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING; + get_rand_mem_physical_padding(); /* Adapt phyiscal memory region size based on available memory */ if (memory_tb < kaslr_regions[0].size_tb) -- 2.18.0
|  |