From 821fb51adee86833f3add2eeb29a8193b16ce303 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 12 Mar 2008 03:53:30 +0100 Subject: [PATCH] --- yaml --- r: 89069 b: refs/heads/master c: f5c24a7fd0798d636af184cc7032e7e0cb149112 h: refs/heads/master i: 89067: 4eb6d02e6a70dd1dbaa9a7c667c2eddc795cc787 v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/bugs_64.c | 12 ++++++++++++ trunk/arch/x86/mm/init_32.c | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 0bc4df2e181f..0a9f1ea28b91 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c9caa02c529d5e113e40cbc77254558fcdfa4215 +refs/heads/master: f5c24a7fd0798d636af184cc7032e7e0cb149112 diff --git a/trunk/arch/x86/kernel/bugs_64.c b/trunk/arch/x86/kernel/bugs_64.c index 60207e999a04..9a3ed0649d4e 100644 --- a/trunk/arch/x86/kernel/bugs_64.c +++ b/trunk/arch/x86/kernel/bugs_64.c @@ -9,6 +9,7 @@ #include #include #include +#include void __init check_bugs(void) { @@ -18,4 +19,15 @@ void __init check_bugs(void) print_cpu_info(&boot_cpu_data); #endif alternative_instructions(); + + /* + * Make sure the first 2MB area is not mapped by huge pages + * There are typically fixed size MTRRs in there and overlapping + * MTRRs into large pages causes slow downs. + * + * Right now we don't do that with gbpages because there seems + * very little benefit for that case. + */ + if (!direct_gbpages) + set_memory_4k((unsigned long)__va(0), 1); } diff --git a/trunk/arch/x86/mm/init_32.c b/trunk/arch/x86/mm/init_32.c index fc3ace2e88f1..1500dc8d63e4 100644 --- a/trunk/arch/x86/mm/init_32.c +++ b/trunk/arch/x86/mm/init_32.c @@ -181,8 +181,13 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) /* * Map with big pages if possible, otherwise * create normal page tables: + * + * Don't use a large page for the first 2/4MB of memory + * because there are often fixed size MTRRs in there + * and overlapping MTRRs into large pages can cause + * slowdowns. */ - if (cpu_has_pse) { + if (cpu_has_pse && !(pgd_idx == 0 && pmd_idx == 0)) { unsigned int addr2; pgprot_t prot = PAGE_KERNEL_LARGE;