[PATCH] x86_64: Allow kernel page tables upto the end of memory

Previously they would be only allocated before the kernel text at
1MB. This limited the maximum supported memory to 128GB.
Now allow the e820 allocator to put them everywhere. Try
to put them beyond any DMA zones to avoid filling them up.
This should free some GFP_DMA memory compared to earlier kernels.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Andi Kleen and committed by Linus Torvalds 6c5acd16 0a9c3ee7

+14 -2
+14 -2
arch/x86_64/mm/init.c
··· 255 255 256 256 static void __init find_early_table_space(unsigned long end) 257 257 { 258 - unsigned long puds, pmds, tables; 258 + unsigned long puds, pmds, tables, start; 259 259 260 260 puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; 261 261 pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; 262 262 tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) + 263 263 round_up(pmds * sizeof(pmd_t), PAGE_SIZE); 264 264 265 - table_start = find_e820_area(0x8000, __pa_symbol(&_text), tables); 265 + /* Put page tables beyond the DMA zones if possible. 266 + RED-PEN might be better to spread them out more over 267 + memory to avoid hotspots */ 268 + if (end > MAX_DMA32_PFN<<PAGE_SHIFT) 269 + start = MAX_DMA32_PFN << PAGE_SHIFT; 270 + else if (end > MAX_DMA_PFN << PAGE_SHIFT) 271 + start = MAX_DMA_PFN << PAGE_SHIFT; 272 + else 273 + start = 0x8000; 274 + 275 + table_start = find_e820_area(start, end, tables); 276 + if (table_start == -1) 277 + table_start = find_e820_area(0x8000, end, tables); 266 278 if (table_start == -1UL) 267 279 panic("Cannot find space for the kernel page tables"); 268 280