login
Header Space

 
 

[PATCH] [4/7] Don't use large pages to map the first 2/4MB of memory

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <andreas.herrmann3@...>, <tglx@...>, <mingo@...>, <linux-kernel@...>
Date: Tuesday, March 11, 2008 - 10:53 pm

Intel recommends to not use large pages for the first 1MB 
of the physical memory because there are fixed size MTRRs there
which cause splitups in the TLBs.

On AMD doing so is also a good idea.

The implementation is a little different between 32bit and 64bit.
On 32bit I just taught the initial page table set up about this
because it was very simple to do. This also has the advantage
that the risk of a prefetch ever seeing the page even
if it only exists for a short time is minimized.

On 64bit that is not quite possible, so use set_memory_4k() a little
later (in check_bugs) instead.

Signed-off-by: Andi Kleen <ak@suse.de>

---
 arch/x86/kernel/bugs_64.c |   12 ++++++++++++
 arch/x86/mm/init_32.c     |    6 +++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

Index: linux/arch/x86/kernel/bugs_64.c
===================================================================
--- linux.orig/arch/x86/kernel/bugs_64.c
+++ linux/arch/x86/kernel/bugs_64.c
@@ -9,6 +9,7 @@
 #include <asm/bugs.h>
 #include <asm/processor.h>
 #include <asm/mtrr.h>
+#include <asm/cacheflush.h>
 
 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);
 }
Index: linux/arch/x86/mm/init_32.c
===================================================================
--- linux.orig/arch/x86/mm/init_32.c
+++ linux/arch/x86/mm/init_32.c
@@ -181,8 +181,13 @@ static void __init kernel_physical_mappi
 			/*
 			 * 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;
 
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] [1/7] Implement true end_pfn_mapped for 32bit, Andi Kleen, (Tue Mar 11, 10:53 pm)
[PATCH] [6/7] Split large page mapping for AMD TSEG, Andi Kleen, (Tue Mar 11, 10:53 pm)
Re: [PATCH] [6/7] Split large page mapping for AMD TSEG, Thomas Gleixner, (Tue Mar 25, 12:44 pm)
Re: [PATCH] [6/7] Split large page mapping for AMD TSEG, Thomas Gleixner, (Fri Mar 21, 1:55 pm)
Re: [PATCH] [6/7] Split large page mapping for AMD TSEG, Joerg Roedel, (Tue Mar 25, 7:56 am)
[PATCH] [5/7] Readd rdmsrl_safe, Andi Kleen, (Tue Mar 11, 10:53 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Thomas Gleixner, (Fri Mar 21, 1:06 pm)
[PATCH] Readd rdmsrl_safe v2, Andi Kleen, (Sat Mar 22, 5:59 am)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Andi Kleen, (Fri Mar 21, 1:16 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Thomas Gleixner, (Fri Mar 21, 1:58 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Andi Kleen, (Fri Mar 21, 2:06 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Thomas Gleixner, (Fri Mar 21, 2:14 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe, Andi Kleen, (Fri Mar 21, 2:46 pm)
Re: [PATCH] [5/7] Readd rdmsrl_safe II, Andi Kleen, (Fri Mar 21, 2:48 pm)
[PATCH] [4/7] Don't use large pages to map the first 2/4MB o..., Andi Kleen, (Tue Mar 11, 10:53 pm)
[PATCH] [3/7] Add set_memory_4k to pageattr.c, Andi Kleen, (Tue Mar 11, 10:53 pm)
speck-geostationary