On Mon, Dec 17, 2018 at 06:43:24PM +0100, Ingo Molnar wrote: > >* Chao Fan <fanc.f...@cn.fujitsu.com> wrote: > >> KASLR randomly chooses some positions which may locate in movable >> memory regions. It will break memory hotplug feature and make the >> movable memory chosen by KASLR practically immovable. >> >> The solution is to limit KASLR to choose memory regions in immovable >> node according to SRAT tables. >> When CONFIG_EARLY_PARSE_RSDP is enabled, walk through SRAT to get the >> information of immovable memory so that KASLR knows where should be >> chosen for randomization. >> >> Rename process_mem_region() as __process_mem_region() and name new >> function as process_mem_region(). >> >> Signed-off-by: Chao Fan <fanc.f...@cn.fujitsu.com> >> --- >> arch/x86/boot/compressed/kaslr.c | 75 +++++++++++++++++++++++++++----- >> 1 file changed, 64 insertions(+), 11 deletions(-) > >Ok, I like this basic approach of automatically detecing memory areas we >should not KASLR into - it's far better than earlier iterations.
Thanks, > >> +++ b/arch/x86/boot/compressed/kaslr.c >> @@ -97,6 +97,11 @@ static bool memmap_too_large; >> /* Store memory limit specified by "mem=nn[KMG]" or "memmap=nn[KMG]" */ >> static unsigned long long mem_limit = ULLONG_MAX; >> >> +#ifdef CONFIG_EARLY_SRAT_PARSE >> +/* The immovable memory regions */ >> +extern struct mem_vector immovable_mem[MAX_NUMNODES*2]; >> +#endif > >What logic is the maximum size of this array based on? > Oh, sorry for that, I ever explained for that, I would add more comments in next PATCH. See arch/x86/mm/numa_internal.h: struct numa_meminfo { int nr_blks; struct numa_memblk blk[NR_NODE_MEMBLKS]; }; In arch/x86/include/asm/numa.h: #define NR_NODE_MEMBLKS (MAX_NUMNODES*2) That means the memory in one node may be devided into 1 or 2 memory regions(Also I saw that in the dmesg). So think about how many regions we need to store the immovable memory. The worst condition is: 1. There are MAX_NUMANODES nodes on this machine. 2. In SRAT table, every node is devided into 2 memory regions. 3. All of them are immovable. So MAX_NUMNODES*2 is the biggest amount. Thanks, Chao Fan >Thanks, > > Ingo > >