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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).