summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-01-11 22:46:57 +0100
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-12 04:05:03 +0100
commit6c5acd160a10c76e8debf4f8fa8256d7c914f290 (patch)
treec13c1d282ad2bce8a6556d5d517879bf5b4343c7
parent[PATCH] x86_64: Use safe_smp_processor_id in MCE handler (diff)
downloadlinux-6c5acd160a10c76e8debf4f8fa8256d7c914f290.tar.xz
linux-6c5acd160a10c76e8debf4f8fa8256d7c914f290.zip
[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>
-rw-r--r--arch/x86_64/mm/init.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c
index e93867850a4f..eca60125efc3 100644
--- a/arch/x86_64/mm/init.c
+++ b/arch/x86_64/mm/init.c
@@ -255,14 +255,26 @@ static void __init phys_pud_init(pud_t *pud, unsigned long address, unsigned lon
static void __init find_early_table_space(unsigned long end)
{
- unsigned long puds, pmds, tables;
+ unsigned long puds, pmds, tables, start;
puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) +
round_up(pmds * sizeof(pmd_t), PAGE_SIZE);
- table_start = find_e820_area(0x8000, __pa_symbol(&_text), tables);
+ /* Put page tables beyond the DMA zones if possible.
+ RED-PEN might be better to spread them out more over
+ memory to avoid hotspots */
+ if (end > MAX_DMA32_PFN<<PAGE_SHIFT)
+ start = MAX_DMA32_PFN << PAGE_SHIFT;
+ else if (end > MAX_DMA_PFN << PAGE_SHIFT)
+ start = MAX_DMA_PFN << PAGE_SHIFT;
+ else
+ start = 0x8000;
+
+ table_start = find_e820_area(start, end, tables);
+ if (table_start == -1)
+ table_start = find_e820_area(0x8000, end, tables);
if (table_start == -1UL)
panic("Cannot find space for the kernel page tables");