From: Yinghai Lu <yhlu.kernel@gmail.com>
To: Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [PATCH] x86: cleanup using max_low_pfn for 32 bit
Date: Mon, 23 Jun 2008 03:05:30 -0700 [thread overview]
Message-ID: <200806230305.30944.yhlu.kernel@gmail.com> (raw)
In-Reply-To: <200806220246.58958.yhlu.kernel@gmail.com>
for max_low_pfn is not changed after it is set.
so we can move that early and out of initmem_init.
could call find_low_pfn_range just after max_pfn is set.
also could move reserve_initrd out of setup_bootmem_allocator
so 32bit is more like 64bit.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
arch/x86/kernel/setup_32.c | 16 ++++++++++------
arch/x86/kernel/setup_64.c | 2 +-
arch/x86/mm/discontig_32.c | 22 +++++++---------------
arch/x86/mm/init_32.c | 25 +++++++++----------------
include/asm-x86/page_32.h | 3 ++-
include/asm-x86/setup.h | 2 --
6 files changed, 29 insertions(+), 41 deletions(-)
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
@@ -189,13 +189,14 @@ static inline void copy_edd(void)
static bool do_relocate_initrd = false;
-void __init reserve_initrd(void)
+static void __init reserve_initrd(void)
{
u64 ramdisk_image = boot_params.hdr.ramdisk_image;
u64 ramdisk_size = boot_params.hdr.ramdisk_size;
u64 ramdisk_end = ramdisk_image + ramdisk_size;
u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
u64 ramdisk_here;
+ u64 ramdisk_target;
if (!boot_params.hdr.type_of_loader ||
!ramdisk_image || !ramdisk_size)
@@ -203,7 +204,7 @@ void __init reserve_initrd(void)
initrd_start = 0;
- if (ramdisk_size >= end_of_lowmem/2) {
+ if (ramdisk_size >= (end_of_lowmem>>1)) {
free_early(ramdisk_image, ramdisk_end);
printk(KERN_ERR "initrd too large to handle, "
"disabling initrd\n");
@@ -226,7 +227,8 @@ void __init reserve_initrd(void)
}
/* We need to move the initrd down into lowmem */
- ramdisk_here = find_e820_area(min_low_pfn<<PAGE_SHIFT,
+ ramdisk_target = max_pfn_mapped<<PAGE_SHIFT;
+ ramdisk_here = find_e820_area(min(ramdisk_target, end_of_lowmem>>1),
end_of_lowmem, ramdisk_size,
PAGE_SIZE);
@@ -347,8 +349,6 @@ static void set_mca_bus(int x) { }
*/
void __init setup_arch(char **cmdline_p)
{
- unsigned long max_low_pfn;
-
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
pre_setup_arch_hook();
early_cpu_init();
@@ -456,6 +456,10 @@ void __init setup_arch(char **cmdline_p)
max_pfn = e820_end_of_ram();
}
+ find_low_pfn_range();
+
+ reserve_initrd();
+
dmi_scan_machine();
io_delay_init();
@@ -472,7 +476,7 @@ void __init setup_arch(char **cmdline_p)
acpi_numa_init();
#endif
- max_low_pfn = initmem_init(0, max_pfn);
+ initmem_init(0, max_pfn);
#ifdef CONFIG_ACPI_SLEEP
/*
Index: linux-2.6/arch/x86/kernel/setup_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup_64.c
+++ linux-2.6/arch/x86/kernel/setup_64.c
@@ -154,7 +154,7 @@ static inline void copy_edd(void)
}
#endif
-void __init reserve_initrd(void)
+static void __init reserve_initrd(void)
{
#ifdef CONFIG_BLK_DEV_INITRD
if (boot_params.hdr.type_of_loader && boot_params.hdr.ramdisk_image) {
Index: linux-2.6/arch/x86/mm/discontig_32.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/discontig_32.c
+++ linux-2.6/arch/x86/mm/discontig_32.c
@@ -309,11 +309,10 @@ static void init_remap_allocator(int nid
(ulong) node_remap_end_vaddr[nid]);
}
-unsigned long __init initmem_init(unsigned long start_pfn,
+void __init initmem_init(unsigned long start_pfn,
unsigned long end_pfn)
{
int nid;
- unsigned long system_start_pfn, system_max_low_pfn;
long kva_target_pfn;
/*
@@ -324,17 +323,11 @@ unsigned long __init initmem_init(unsign
* and ZONE_HIGHMEM.
*/
- /* call find_max_low_pfn at first, it could update max_pfn */
- system_max_low_pfn = max_low_pfn = find_max_low_pfn();
-
remove_all_active_ranges();
get_memcfg_numa();
kva_pages = round_up(calculate_numa_remap_pages(), PTRS_PER_PTE);
- /* partially used pages are not usable - thus round upwards */
- system_start_pfn = min_low_pfn = PFN_UP(init_pg_tables_end);
-
kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE);
do {
kva_start_pfn = find_e820_area(kva_target_pfn<<PAGE_SHIFT,
@@ -357,19 +350,19 @@ unsigned long __init initmem_init(unsign
"KVA PG");
#ifdef CONFIG_HIGHMEM
highstart_pfn = highend_pfn = max_pfn;
- if (max_pfn > system_max_low_pfn)
- highstart_pfn = system_max_low_pfn;
+ if (max_pfn > max_low_pfn)
+ highstart_pfn = max_low_pfn;
printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
pages_to_mb(highend_pfn - highstart_pfn));
num_physpages = highend_pfn;
high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
#else
- num_physpages = system_max_low_pfn;
- high_memory = (void *) __va(system_max_low_pfn * PAGE_SIZE - 1) + 1;
+ num_physpages = max_low_pfn;
+ high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
#endif
printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
- pages_to_mb(system_max_low_pfn));
- printk("min_low_pfn = %ld, max_low_pfn = %ld, highstart_pfn = %ld\n",
+ pages_to_mb(max_low_pfn));
+ printk("min_low_pfn = %ld, max_low_pfn = %ld, highstart_pfn = %ld\n",
min_low_pfn, max_low_pfn, highstart_pfn);
printk("Low memory ends at vaddr %08lx\n",
@@ -387,7 +380,6 @@ unsigned long __init initmem_init(unsign
memset(NODE_DATA(0), 0, sizeof(struct pglist_data));
NODE_DATA(0)->bdata = &node0_bdata;
setup_bootmem_allocator();
- return max_low_pfn;
}
void __init zone_sizes_init(void)
Index: linux-2.6/arch/x86/mm/init_32.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/init_32.c
+++ linux-2.6/arch/x86/mm/init_32.c
@@ -561,9 +561,15 @@ early_param("highmem", parse_highmem);
/*
* Determine low and high memory ranges:
*/
-unsigned long __init find_max_low_pfn(void)
+void __init find_low_pfn_range(void)
{
- unsigned long max_low_pfn;
+ /* it could update max_pfn */
+
+ /*
+ * partially used pages are not usable - thus
+ * we are rounding upwards:
+ */
+ min_low_pfn = PFN_UP(init_pg_tables_end);
max_low_pfn = max_pfn;
if (max_low_pfn > MAXMEM_PFN) {
@@ -625,21 +631,12 @@ unsigned long __init find_max_low_pfn(vo
" kernel!\n");
#endif
}
- return max_low_pfn;
}
#ifndef CONFIG_NEED_MULTIPLE_NODES
-unsigned long __init initmem_init(unsigned long start_pfn,
+void __init initmem_init(unsigned long start_pfn,
unsigned long end_pfn)
{
- /*
- * partially used pages are not usable - thus
- * we are rounding upwards:
- */
- min_low_pfn = PFN_UP(init_pg_tables_end);
-
- max_low_pfn = find_max_low_pfn();
-
#ifdef CONFIG_HIGHMEM
highstart_pfn = highend_pfn = max_pfn;
if (max_pfn > max_low_pfn)
@@ -661,8 +658,6 @@ unsigned long __init initmem_init(unsign
pages_to_mb(max_low_pfn));
setup_bootmem_allocator();
-
- return max_low_pfn;
}
void __init zone_sizes_init(void)
@@ -699,8 +694,6 @@ void __init setup_bootmem_allocator(void
panic("Cannot find bootmem map of size %ld\n", bootmap_size);
reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP");
- reserve_initrd();
-
bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, max_low_pfn);
printk(KERN_INFO " mapped low ram: 0 - %08lx\n",
max_pfn_mapped<<PAGE_SHIFT);
Index: linux-2.6/include/asm-x86/page_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/page_32.h
+++ linux-2.6/include/asm-x86/page_32.h
@@ -97,7 +97,8 @@ extern int sysctl_legacy_va_layout;
#define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE)
#define MAXMEM (-__PAGE_OFFSET - __VMALLOC_RESERVE)
-extern unsigned long initmem_init(unsigned long, unsigned long);
+extern void find_low_pfn_range(void);
+extern void initmem_init(unsigned long, unsigned long);
extern void zone_sizes_init(void);
extern void setup_bootmem_allocator(void);
Index: linux-2.6/include/asm-x86/setup.h
===================================================================
--- linux-2.6.orig/include/asm-x86/setup.h
+++ linux-2.6/include/asm-x86/setup.h
@@ -39,8 +39,6 @@ void reserve_crashkernel(void);
#include <asm/bootparam.h>
void reserve_standard_io_resources(void);
-void reserve_initrd(void);
-
#ifndef _SETUP
next prev parent reply other threads:[~2008-06-23 10:05 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-18 9:15 [PATCH] x86: make 64bit identify_cpu use cpu_dev Yinghai Lu
2008-06-18 14:17 ` Ingo Molnar
2008-06-19 9:03 ` Ingo Molnar
2008-06-19 20:00 ` Yinghai Lu
2008-06-19 22:30 ` [PATCH] x86: make 64bit identify_cpu use cpu_dev v2 Yinghai Lu
2008-06-20 6:29 ` Ingo Molnar
2008-06-20 7:08 ` Yinghai Lu
[not found] ` <200806210323.01590.yhlu.kernel@gmail.com>
2008-06-21 10:24 ` [PATCH] x86: change identify_cpu to static Yinghai Lu
2008-06-21 10:24 ` [PATCH] x86: seperate funcs from setup_64 to cpu common_64.c Yinghai Lu
2008-06-21 23:25 ` [PATCH] x86: merge setup64.c into common_64.c Yinghai Lu
2008-06-22 2:16 ` [PATCH] x86: remove two duplicated func in setup_32.c Yinghai Lu
2008-06-22 3:22 ` [PATCH] x86: move reserve_standard_io_resource to setup.c Yinghai Lu
2008-06-22 4:02 ` [PATCH] x86: move elfcorehdr parsing " Yinghai Lu
2008-06-22 9:44 ` [PATCH] x86: introduce initmem_init for 64 bit Yinghai Lu
2008-06-22 9:45 ` [PATCH] x86: introduce initmem_init for 32 bit Yinghai Lu
2008-06-22 9:46 ` [PATCH] x86: introduce reserve_initrd Yinghai Lu
2008-06-23 0:37 ` [PATCH] x86: move boot_params declaring to setup.c Yinghai Lu
2008-06-23 0:40 ` [PATCH] x86: move reservetop and vmalloc parsing to pgtable_32.c Yinghai Lu
2008-06-23 0:40 ` [PATCH] x86: introduce reserve_initrd Yinghai Lu
2008-06-23 10:04 ` [PATCH] x86: move reservetop and vmalloc parsing to pgtable_32.c Yinghai Lu
2008-06-23 10:05 ` Yinghai Lu [this message]
2008-06-23 19:56 ` [PATCH] x86: cleanup using max_low_pfn for 32 bit Ingo Molnar
2008-06-23 19:57 ` H. Peter Anvin
2008-06-23 20:22 ` Ingo Molnar
2008-06-23 20:27 ` Yinghai Lu
2008-06-23 10:06 ` [PATCH] x86: cleanup min_low_pfn 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=200806230305.30944.yhlu.kernel@gmail.com \
--to=yhlu.kernel@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/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.