diff options
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r-- | arch/x86_64/mm/init.c | 16 |
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 | |||
255 | 255 | ||
256 | static void __init find_early_table_space(unsigned long end) | 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 | puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; | 260 | puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; |
261 | pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; | 261 | pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; |
262 | tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) + | 262 | tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) + |
263 | round_up(pmds * sizeof(pmd_t), PAGE_SIZE); | 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 | if (table_start == -1UL) | 278 | if (table_start == -1UL) |
267 | panic("Cannot find space for the kernel page tables"); | 279 | panic("Cannot find space for the kernel page tables"); |
268 | 280 | ||