Re: [PATCH] x86_32: trim memory by updating e820 v2

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Ingo Molnar
Date: Tuesday, January 22, 2008 - 9:51 am

* Yinghai Lu <Yinghai.Lu@Sun.COM> wrote:


i picked up the patch below, and it crashes with:

  Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
  Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
  ------------[ cut here ]------------
  kernel BUG at arch/x86/mm/pageattr_32.c:327!
  invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC

  Pid: 0, comm: swapper Not tainted (2.6.24-rc8 #15)
  EIP: 0060:[<c0116a3f>] EFLAGS: 00010297 CPU: 0
  EIP is at kernel_map_pages+0x52/0xb3

config and bootlog attached as well.

	Ingo

------------------>
Subject: x86_32: trim memory by updating e820
From: Yinghai Lu <Yinghai.Lu@Sun.COM>

when mtrr is not covering all e820 table, need to trim the ram, need to
update e820

reuse some code for x86_64

here need to add early_identify_cpu for x86_32, and move mtrr_bp_init
early

compiled test only, need someone test it

Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 Documentation/kernel-parameters.txt |    2 +-
 arch/x86/kernel/cpu/common.c        |   12 ++++++++----
 arch/x86/kernel/cpu/mtrr/main.c     |    2 --
 arch/x86/kernel/e820_32.c           |   11 +++++++++++
 arch/x86/kernel/setup_32.c          |    7 +++++++
 arch/x86/kernel/setup_64.c          |    4 +---
 include/asm-x86/e820_32.h           |    3 +++
 include/asm-x86/processor.h         |    1 +
 8 files changed, 32 insertions(+), 10 deletions(-)

Index: linux-x86.q/Documentation/kernel-parameters.txt
===================================================================
--- linux-x86.q.orig/Documentation/kernel-parameters.txt
+++ linux-x86.q/Documentation/kernel-parameters.txt
@@ -575,7 +575,7 @@ and is between 256 and 4096 characters. 
 			See drivers/char/README.epca and
 			Documentation/digiepca.txt.
 
-	disable_mtrr_trim [X86-64, Intel only]
+	disable_mtrr_trim [X86, Intel and AMD only]
 			By default the kernel will trim any uncacheable
 			memory out of your available memory pool based on
 			MTRR settings.  This parameter disables that behavior,
Index: linux-x86.q/arch/x86/kernel/cpu/common.c
===================================================================
--- linux-x86.q.orig/arch/x86/kernel/cpu/common.c
+++ linux-x86.q/arch/x86/kernel/cpu/common.c
@@ -396,11 +396,9 @@ __setup("serialnumber", x86_serial_nr_se
 /*
  * This does the hard work of actually picking apart the CPU stuff...
  */
-void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
+void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
 {
-	int i;
 
-	c->loops_per_jiffy = loops_per_jiffy;
 	c->x86_cache_size = -1;
 	c->x86_vendor = X86_VENDOR_UNKNOWN;
 	c->cpuid_level = -1;	/* CPUID not detected */
@@ -424,7 +422,14 @@ void __cpuinit identify_cpu(struct cpuin
 
 	if (this_cpu->c_identify)
 		this_cpu->c_identify(c);
+}
 
+void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
+{
+	int i;
+
+	c->loops_per_jiffy = loops_per_jiffy;
+	early_identify_cpu(c);
 	/*
 	 * Vendor-specific initialization.  In this section we
 	 * canonicalize the feature flags, meaning if there are
@@ -485,7 +490,6 @@ void __init identify_boot_cpu(void)
 	identify_cpu(&boot_cpu_data);
 	sysenter_setup();
 	enable_sep_cpu();
-	mtrr_bp_init();
 }
 
 void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
Index: linux-x86.q/arch/x86/kernel/cpu/mtrr/main.c
===================================================================
--- linux-x86.q.orig/arch/x86/kernel/cpu/mtrr/main.c
+++ linux-x86.q/arch/x86/kernel/cpu/mtrr/main.c
@@ -624,7 +624,6 @@ static struct sysdev_driver mtrr_sysdev_
 	.resume		= mtrr_restore,
 };
 
-#ifdef CONFIG_X86_64
 static int disable_mtrr_trim;
 
 static int __init disable_mtrr_trim_setup(char *str)
@@ -726,7 +725,6 @@ int __init mtrr_trim_uncached_memory(uns
 
 	return 0;
 }
-#endif
 
 /**
  * mtrr_bp_init - initialize mtrrs on the boot CPU
Index: linux-x86.q/arch/x86/kernel/e820_32.c
===================================================================
--- linux-x86.q.orig/arch/x86/kernel/e820_32.c
+++ linux-x86.q/arch/x86/kernel/e820_32.c
@@ -749,3 +749,14 @@ static int __init parse_memmap(char *arg
 	return 0;
 }
 early_param("memmap", parse_memmap);
+void __init update_e820(void)
+{
+	u8 nr_map;
+
+	nr_map = e820.nr_map;
+	if (sanitize_e820_map(e820.map, &nr_map))
+		return;
+	e820.nr_map = nr_map;
+	printk(KERN_INFO "modified physical RAM map:\n");
+	print_memory_map("modified");
+}
Index: linux-x86.q/arch/x86/kernel/setup_32.c
===================================================================
--- linux-x86.q.orig/arch/x86/kernel/setup_32.c
+++ linux-x86.q/arch/x86/kernel/setup_32.c
@@ -49,6 +49,7 @@
 
 #include <video/edid.h>
 
+#include <asm/mtrr.h>
 #include <asm/apic.h>
 #include <asm/e820.h>
 #include <asm/mpspec.h>
@@ -747,6 +748,7 @@ void __init setup_arch(char **cmdline_p)
 	bss_resource.start = virt_to_phys(&__bss_start);
 	bss_resource.end = virt_to_phys(&__bss_stop)-1;
 
+	early_identify_cpu(&boot_cpu_data);
 	parse_early_param();
 
 	if (user_defined_memmap) {
@@ -762,6 +764,11 @@ void __init setup_arch(char **cmdline_p)
 
 	max_low_pfn = setup_memory();
 
+	/* update e820 for memory not covered by WB MTRRs */
+	mtrr_bp_init();
+	if (mtrr_trim_uncached_memory(max_pfn))
+		max_low_pfn = setup_memory();
+
 #ifdef CONFIG_VMI
 	/*
 	 * Must be after max_low_pfn is determined, and before kernel
Index: linux-x86.q/arch/x86/kernel/setup_64.c
===================================================================
--- linux-x86.q.orig/arch/x86/kernel/setup_64.c
+++ linux-x86.q/arch/x86/kernel/setup_64.c
@@ -157,8 +157,6 @@ static struct resource bss_resource = {
 	.flags = IORESOURCE_RAM,
 };
 
-static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c);
-
 #ifdef CONFIG_PROC_VMCORE
 /* elfcorehdr= specifies the location of elf core header
  * stored by the crashed kernel. This option will be passed
@@ -890,7 +888,7 @@ struct cpu_model_info {
 /* Do some early cpuid on the boot CPU to get some parameter that are
    needed before check_bugs. Everything advanced is in identify_cpu
    below. */
-static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
+void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
 {
 	u32 tfms, xlvl;
 
Index: linux-x86.q/include/asm-x86/e820_32.h
===================================================================
--- linux-x86.q.orig/include/asm-x86/e820_32.h
+++ linux-x86.q/include/asm-x86/e820_32.h
@@ -19,12 +19,15 @@
 #ifndef __ASSEMBLY__
 
 extern struct e820map e820;
+extern void update_e820(void);
 
 extern int e820_all_mapped(unsigned long start, unsigned long end,
 			   unsigned type);
 extern int e820_any_mapped(u64 start, u64 end, unsigned type);
 extern void find_max_pfn(void);
 extern void register_bootmem_low_pages(unsigned long max_low_pfn);
+extern void add_memory_region(unsigned long long start,
+			      unsigned long long size, int type);
 extern void e820_register_memory(void);
 extern void limit_regions(unsigned long long size);
 extern void print_memory_map(char *who);
Index: linux-x86.q/include/asm-x86/processor.h
===================================================================
--- linux-x86.q.orig/include/asm-x86/processor.h
+++ linux-x86.q/include/asm-x86/processor.h
@@ -131,6 +131,7 @@ DECLARE_PER_CPU(struct cpuinfo_x86, cpu_
 
 void cpu_detect(struct cpuinfo_x86 *c);
 
+extern void early_identify_cpu(struct cpuinfo_x86 *);
 extern void identify_cpu(struct cpuinfo_x86 *);
 extern void identify_boot_cpu(void);
 extern void identify_secondary_cpu(struct cpuinfo_x86 *);
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Sun Jan 20, 11:56 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Jesse Barnes, (Mon Jan 21, 9:30 am)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 21, 12:14 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Mon Jan 21, 1:09 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 21, 2:37 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Ingo Molnar, (Tue Jan 22, 9:51 am)
[PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Jan 22, 5:23 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Tue Jan 22, 8:50 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Fri Jan 25, 5:01 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Fri Jan 25, 5:16 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Fri Jan 25, 5:37 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Ingo Molnar, (Mon Jan 28, 8:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 28, 11:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Andrew Morton, (Sat Apr 26, 3:56 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Sat Apr 26, 5:56 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 5:57 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 6:05 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 6:22 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Sun Apr 27, 1:21 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Sun Apr 27, 1:29 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sun Apr 27, 11:44 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sun Apr 27, 11:50 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 1:38 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 2:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:18 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 2:34 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 2:44 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:54 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:58 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 3:03 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 3:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Mon Apr 28, 6:53 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 7:11 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 7:15 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 7:24 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Mon Apr 28, 9:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 9:31 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Mon Apr 28, 9:55 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Mon Apr 28, 11:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:03 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:06 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:08 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 12:38 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 12:46 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 1:45 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:19 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 3:03 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 3:56 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 4:16 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 4:23 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 6:05 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 7:41 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:31 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:34 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:37 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 3:42 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Andrew Morton, (Tue Apr 29, 5:40 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Tue Apr 29, 8:52 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 10:29 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 11:40 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 12:19 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 12:44 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 1:02 pm)
[patch] PCI: export resource_wc in pci sysfs, Ingo Molnar, (Tue Apr 29, 3:03 pm)
Re: [patch] PCI: export resource_wc in pci sysfs, Andrew Morton, (Tue Apr 29, 3:24 pm)