diff options
| -rw-r--r-- | arch/x86/mm/init.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index fd3da1dda1c..ae4f7b5d710 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <asm/page.h> | 7 | #include <asm/page.h> |
| 8 | #include <asm/page_types.h> | 8 | #include <asm/page_types.h> |
| 9 | #include <asm/sections.h> | 9 | #include <asm/sections.h> |
| 10 | #include <asm/setup.h> | ||
| 10 | #include <asm/system.h> | 11 | #include <asm/system.h> |
| 11 | #include <asm/tlbflush.h> | 12 | #include <asm/tlbflush.h> |
| 12 | 13 | ||
| @@ -304,8 +305,23 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, | |||
| 304 | #endif | 305 | #endif |
| 305 | 306 | ||
| 306 | #ifdef CONFIG_X86_64 | 307 | #ifdef CONFIG_X86_64 |
| 307 | if (!after_bootmem) | 308 | if (!after_bootmem && !start) { |
| 309 | pud_t *pud; | ||
| 310 | pmd_t *pmd; | ||
| 311 | |||
| 308 | mmu_cr4_features = read_cr4(); | 312 | mmu_cr4_features = read_cr4(); |
| 313 | |||
| 314 | /* | ||
| 315 | * _brk_end cannot change anymore, but it and _end may be | ||
| 316 | * located on different 2M pages. cleanup_highmap(), however, | ||
| 317 | * can only consider _end when it runs, so destroy any | ||
| 318 | * mappings beyond _brk_end here. | ||
| 319 | */ | ||
| 320 | pud = pud_offset(pgd_offset_k(_brk_end), _brk_end); | ||
| 321 | pmd = pmd_offset(pud, _brk_end - 1); | ||
| 322 | while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1)) | ||
| 323 | pmd_clear(pmd); | ||
| 324 | } | ||
| 309 | #endif | 325 | #endif |
| 310 | __flush_tlb_all(); | 326 | __flush_tlb_all(); |
| 311 | 327 | ||
