[PATCH] x86_64: Allow kernel page tables upto the end of memory
authorAndi Kleen <ak@suse.de>
Wed, 11 Jan 2006 21:46:57 +0000 (22:46 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 12 Jan 2006 03:05:03 +0000 (19:05 -0800)
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>
arch/x86_64/mm/init.c

index e93867850a4f3dce9717ad8ecc79b70e660128f0..eca60125efc3b76a5e8145829f362f031757d35e 100644 (file)
@@ -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");