diff options
-rw-r--r-- | arch/x86/mm/init_32.c | 9 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 14 |
2 files changed, 23 insertions, 0 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 5fad0f95d5a3..86a99947455b 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -855,24 +855,33 @@ static void __init find_early_table_space(unsigned long end, int use_pse, | |||
855 | unsigned long extra; | 855 | unsigned long extra; |
856 | 856 | ||
857 | extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT); | 857 | extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT); |
858 | #ifdef CONFIG_X86_32 | ||
858 | extra += PMD_SIZE; | 859 | extra += PMD_SIZE; |
860 | #endif | ||
859 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; | 861 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; |
860 | } else | 862 | } else |
861 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; | 863 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; |
862 | 864 | ||
863 | tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE); | 865 | tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE); |
864 | 866 | ||
867 | #ifdef CONFIG_X86_32 | ||
865 | /* for fixmap */ | 868 | /* for fixmap */ |
866 | tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE); | 869 | tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE); |
870 | #endif | ||
867 | 871 | ||
868 | /* | 872 | /* |
869 | * RED-PEN putting page tables only on node 0 could | 873 | * RED-PEN putting page tables only on node 0 could |
870 | * cause a hotspot and fill up ZONE_DMA. The page tables | 874 | * cause a hotspot and fill up ZONE_DMA. The page tables |
871 | * need roughly 0.5KB per GB. | 875 | * need roughly 0.5KB per GB. |
872 | */ | 876 | */ |
877 | #ifdef CONFIG_X86_32 | ||
873 | start = 0x7000; | 878 | start = 0x7000; |
874 | table_start = find_e820_area(start, max_pfn_mapped<<PAGE_SHIFT, | 879 | table_start = find_e820_area(start, max_pfn_mapped<<PAGE_SHIFT, |
875 | tables, PAGE_SIZE); | 880 | tables, PAGE_SIZE); |
881 | #else /* CONFIG_X86_64 */ | ||
882 | start = 0x8000; | ||
883 | table_start = find_e820_area(start, end, tables, PAGE_SIZE); | ||
884 | #endif | ||
876 | if (table_start == -1UL) | 885 | if (table_start == -1UL) |
877 | panic("Cannot find space for the kernel page tables"); | 886 | panic("Cannot find space for the kernel page tables"); |
878 | 887 | ||
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index cdb3be1c41f1..151e5ba34412 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -569,19 +569,33 @@ static void __init find_early_table_space(unsigned long end, int use_pse, | |||
569 | unsigned long extra; | 569 | unsigned long extra; |
570 | 570 | ||
571 | extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT); | 571 | extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT); |
572 | #ifdef CONFIG_X86_32 | ||
573 | extra += PMD_SIZE; | ||
574 | #endif | ||
572 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; | 575 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; |
573 | } else | 576 | } else |
574 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; | 577 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; |
575 | 578 | ||
576 | tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE); | 579 | tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE); |
577 | 580 | ||
581 | #ifdef CONFIG_X86_32 | ||
582 | /* for fixmap */ | ||
583 | tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE); | ||
584 | #endif | ||
585 | |||
578 | /* | 586 | /* |
579 | * RED-PEN putting page tables only on node 0 could | 587 | * RED-PEN putting page tables only on node 0 could |
580 | * cause a hotspot and fill up ZONE_DMA. The page tables | 588 | * cause a hotspot and fill up ZONE_DMA. The page tables |
581 | * need roughly 0.5KB per GB. | 589 | * need roughly 0.5KB per GB. |
582 | */ | 590 | */ |
591 | #ifdef CONFIG_X86_32 | ||
592 | start = 0x7000; | ||
593 | table_start = find_e820_area(start, max_pfn_mapped<<PAGE_SHIFT, | ||
594 | tables, PAGE_SIZE); | ||
595 | #else /* CONFIG_X86_64 */ | ||
583 | start = 0x8000; | 596 | start = 0x8000; |
584 | table_start = find_e820_area(start, end, tables, PAGE_SIZE); | 597 | table_start = find_e820_area(start, end, tables, PAGE_SIZE); |
598 | #endif | ||
585 | if (table_start == -1UL) | 599 | if (table_start == -1UL) |
586 | panic("Cannot find space for the kernel page tables"); | 600 | panic("Cannot find space for the kernel page tables"); |
587 | 601 | ||