From: Yinghai Lu <Yinghai.Lu@Sun.COM>
To: Ingo Molnar <mingo@elte.hu>
Cc: Andi Kleen <ak@suse.de>, "H. Peter Anvin" <hpa@zytor.com>,
LKML <linux-kernel@vger.kernel.org>,
Jesse Barnes <jesse.barnes@intel.com>,
Andrew Morton <akpm@linux-foundation.org>
Subject: [PATCH] x86_32: trim memory by updating e820 v3
Date: Tue, 22 Jan 2008 16:23:20 -0800 [thread overview]
Message-ID: <200801221623.20861.yinghai.lu@sun.com> (raw)
In-Reply-To: <20080122165125.GA17992@elte.hu>
[PATCH] x86_32: trim memory by updating e820 v3
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_get_cap and use it in early_cpu_detect, and move mtrr_bp_init early
need Justine to test with his special system with bug bios.
Signed-off-by: Yinghai Lu <yinghai.lu@sun.com>
Index: linux-2.6/arch/x86/kernel/cpu/common.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/cpu/common.c
+++ linux-2.6/arch/x86/kernel/cpu/common.c
@@ -278,6 +278,33 @@ void __init cpu_detect(struct cpuinfo_x8
c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
}
}
+static void __cpuinit early_get_cap(struct cpuinfo_x86 *c)
+{
+ u32 tfms, xlvl;
+ int ebx;
+
+ memset(&c->x86_capability, 0, sizeof c->x86_capability);
+ if (have_cpuid_p()) {
+ /* Intel-defined flags: level 0x00000001 */
+ if (c->cpuid_level >= 0x00000001) {
+ u32 capability, excap;
+ cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
+ c->x86_capability[0] = capability;
+ c->x86_capability[4] = excap;
+ }
+
+ /* AMD-defined flags: level 0x80000001 */
+ xlvl = cpuid_eax(0x80000000);
+ if ((xlvl & 0xffff0000) == 0x80000000) {
+ if (xlvl >= 0x80000001) {
+ c->x86_capability[1] = cpuid_edx(0x80000001);
+ c->x86_capability[6] = cpuid_ecx(0x80000001);
+ }
+ }
+
+ }
+
+}
/* Do minimum CPU detection early.
Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment.
@@ -306,6 +333,8 @@ static void __init early_cpu_detect(void
early_init_intel(c);
break;
}
+
+ early_get_cap(c);
}
static void __cpuinit generic_identify(struct cpuinfo_x86 * c)
@@ -485,7 +514,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-2.6/arch/x86/kernel/setup_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup_32.c
+++ linux-2.6/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>
@@ -762,6 +763,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-2.6/arch/x86/kernel/cpu/mtrr/main.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/cpu/mtrr/main.c
+++ linux-2.6/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-2.6/Documentation/kernel-parameters.txt
===================================================================
--- linux-2.6.orig/Documentation/kernel-parameters.txt
+++ linux-2.6/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-2.6/arch/x86/kernel/e820_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820_32.c
+++ linux-2.6/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-2.6/include/asm-x86/e820_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820_32.h
+++ linux-2.6/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);
next prev parent reply other threads:[~2008-01-23 0:17 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-20 4:45 [PATCH] x86: disable_mtrr_trim only need for x86_64 Yinghai Lu
2008-01-20 5:37 ` H. Peter Anvin
2008-01-20 6:55 ` Yinghai Lu
2008-01-20 8:17 ` [PATCH] x86_64: update e820 instead of updating end_pfn Yinghai Lu
2008-01-20 9:20 ` Ingo Molnar
2008-01-20 15:08 ` Andi Kleen
2008-01-21 5:40 ` [PATCH] x86_64: update e820 instead of updating end_pfn v2 Yinghai Lu
2008-01-21 5:44 ` [PATCH] x86_32: trim memory by updating e820 Yinghai Lu
2008-01-21 5:58 ` [PATCH] x86_64: update e820 instead of updating end_pfn v2 Andi Kleen
2008-01-21 6:05 ` Harvey Harrison
2008-01-21 6:08 ` Andi Kleen
2008-01-21 6:14 ` Li Zefan
2008-01-21 6:57 ` [PATCH] x86_64: check if Tom2 is enabled Yinghai Lu
2008-01-21 17:24 ` Cyrill Gorcunov
2008-01-21 17:39 ` H. Peter Anvin
2008-01-21 17:49 ` Cyrill Gorcunov
2008-01-21 18:03 ` Andi Kleen
2008-01-21 18:09 ` Cyrill Gorcunov
2008-01-21 18:15 ` H. Peter Anvin
2008-01-21 18:46 ` Andi Kleen
2008-01-21 0:00 ` [PATCH] x86_64: update e820 instead of updating end_pfn Yinghai Lu
[not found] ` <200801202255.02645.yinghai.lu@sun.com>
[not found] ` <200801202255.58642.yinghai.lu@sun.com>
2008-01-21 6:56 ` [PATCH] x86_32: trim memory by updating e820 v2 Yinghai Lu
2008-01-21 16:30 ` Jesse Barnes
2008-01-21 19:14 ` Justin Piszcz
2008-01-21 20:09 ` Yinghai Lu
2008-01-21 21:37 ` Justin Piszcz
2008-01-23 3:50 ` Yinghai Lu
2008-01-26 0:01 ` Justin Piszcz
2008-01-26 0:16 ` Yinghai Lu
2008-01-26 0:37 ` Justin Piszcz
2008-01-28 15:09 ` Ingo Molnar
2008-01-28 18:07 ` Justin Piszcz
2008-01-22 16:51 ` Ingo Molnar
2008-01-23 0:23 ` Yinghai Lu [this message]
2008-04-26 10:56 ` [PATCH] x86_32: trim memory by updating e820 v3 Andrew Morton
2008-04-26 12:56 ` Gabriel C
2008-04-27 1:05 ` Yinghai Lu
2008-04-28 18:07 ` Eric W. Biederman
2008-04-28 23:16 ` Yinghai Lu
2008-04-29 10:31 ` Ingo Molnar
2008-04-29 17:29 ` Eric W. Biederman
2008-04-29 18:40 ` Yinghai Lu
2008-04-29 19:19 ` Eric W. Biederman
2008-04-29 19:44 ` Yinghai Lu
2008-04-29 20:02 ` Eric W. Biederman
2008-04-28 6:44 ` Yinghai Lu
2008-04-28 9:18 ` Gabriel C
2008-04-28 9:34 ` Yinghai Lu
2008-04-28 9:54 ` Gabriel C
2008-04-28 10:03 ` Gabriel C
2008-04-28 10:07 ` Mika Fischer
2008-04-28 19:03 ` Yinghai Lu
2008-04-28 13:53 ` Ingo Molnar
2008-04-28 14:11 ` Mika Fischer
2008-04-28 14:24 ` Gabriel C
2008-04-28 19:06 ` Yinghai Lu
2008-04-28 19:38 ` Gabriel C
2008-04-28 20:45 ` Gabriel C
2008-04-28 21:19 ` Gabriel C
2008-04-28 22:03 ` Yinghai Lu
2008-04-28 22:56 ` Gabriel C
2008-04-28 23:23 ` Yinghai Lu
2008-04-29 1:05 ` Gabriel C
2008-04-29 2:41 ` Yinghai Lu
2008-04-29 10:34 ` Ingo Molnar
2008-04-29 10:42 ` Yinghai Lu
2008-04-28 19:08 ` Yinghai Lu
2008-04-28 19:46 ` Gabriel C
2008-04-28 14:15 ` Gabriel C
2008-04-28 16:09 ` Jesse Barnes
2008-04-28 16:31 ` Mika Fischer
2008-04-28 16:55 ` Jesse Barnes
2008-04-29 10:37 ` Ingo Molnar
2008-04-29 12:40 ` Andrew Morton
2008-04-29 15:52 ` Jesse Barnes
2008-04-29 22:03 ` [patch] PCI: export resource_wc in pci sysfs Ingo Molnar
2008-04-29 22:24 ` Andrew Morton
2008-04-27 0:57 ` [PATCH] x86_32: trim memory by updating e820 v3 Yinghai Lu
2008-04-27 8:21 ` Mika Fischer
2008-04-27 1:22 ` Yinghai Lu
2008-04-27 8:29 ` Mika Fischer
2008-04-28 6:50 ` Yinghai Lu
2008-04-28 8:38 ` Mika Fischer
2008-04-28 9:09 ` Yinghai Lu
2008-04-28 9:44 ` Mika Fischer
2008-04-28 9:58 ` Gabriel C
2008-01-21 6:57 ` [PATCH] x86_64: update e820 instead of updating end_pfn v3 Yinghai Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200801221623.20861.yinghai.lu@sun.com \
--to=yinghai.lu@sun.com \
--cc=ak@suse.de \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=jesse.barnes@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.