x86: clean up using max_low_pfn on 32-bit
authorYinghai Lu <yhlu.kernel@gmail.com>
Mon, 23 Jun 2008 10:05:30 +0000 (03:05 -0700)
committerIngo Molnar <mingo@elte.hu>
Tue, 8 Jul 2008 10:50:20 +0000 (12:50 +0200)
so that 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>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/setup_32.c
arch/x86/mm/discontig_32.c
arch/x86/mm/init_32.c
include/asm-x86/page_32.h
include/asm-x86/setup.h

index 9a08490a3889b1076139e035a409152d2ba7dcc5..b42f570a5a566e2ae5ea983cdf4b902c445aafbc 100644 (file)
@@ -188,13 +188,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)
@@ -202,7 +203,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");
@@ -225,7 +226,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);
 
@@ -346,8 +348,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();
@@ -450,6 +450,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();
@@ -466,7 +470,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 3e75be46c4f21b7b9d8e1195c7e5982be9b128be..1dfff700264c06d3a6805cb8020b61527c5cf8f2 100644 (file)
@@ -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(unsigned long start_pfn,
         * 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(unsigned long start_pfn,
                     "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(unsigned long start_pfn,
        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 d1017336f1b504a4a2d46c2b52985fe7d8daeda8..27b82931294494af5fab7b1ac04fd606b9cc5b26 100644 (file)
@@ -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(void)
                                        " 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(unsigned long start_pfn,
                        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 a0713d175f45b6c7b09e23d971c380c69d006f8f..3810d14051e853b5014d131812f03aba5bd04bc7 100644 (file)
@@ -92,7 +92,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 8f85b245056236c43e811526b8f74c9b5b83c7eb..bb12a1619c12ddc6fbf116d8f0ab1ee51f845265 100644 (file)
@@ -39,8 +39,6 @@ void reserve_crashkernel(void);
 #include <asm/bootparam.h>
 
 void reserve_standard_io_resources(void);
-void reserve_initrd(void);
-
 
 #ifndef _SETUP