[PARISC] Unbreak discontigmem mem_init()
authorKyle McMartin <kyle@mako.i.cabal.ca>
Tue, 17 Oct 2006 00:34:00 +0000 (20:34 -0400)
committerKyle McMartin <kyle@ubuntu.com>
Fri, 8 Dec 2006 05:33:57 +0000 (00:33 -0500)
The `simple' way of walking and checking PageReserved is broken on
discontigmem, instead we need to check each range explicitly.

(Also rename a few things so they make more sense.)

Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
arch/parisc/mm/init.c

index d9e4ab5..1c5fe8f 100644 (file)
@@ -455,7 +455,6 @@ unsigned long pcxl_dma_start __read_mostly;
 void __init mem_init(void)
 {
        int codesize, reservedpages, datasize, initsize;
-       int tmp;
 
        high_memory = __va((max_pfn << PAGE_SHIFT));
 
@@ -470,17 +469,33 @@ void __init mem_init(void)
                        totalram_pages += free_all_bootmem_node(NODE_DATA(i));
        }
 #endif
-       codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-       datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-       initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
+
+       codesize = (unsigned long)_etext - (unsigned long)_text;
+       datasize = (unsigned long)_edata - (unsigned long)_etext;
+       initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
 
        reservedpages = 0;
-       for (tmp = 0; tmp < max_low_pfn; tmp++)
+{
+       unsigned long pfn;
+#ifdef CONFIG_DISCONTIGMEM
+       int i;
+
+       for (i = 0; i < npmem_ranges; i++) {
+               for (pfn = node_start_pfn(i); pfn < node_end_pfn(i); pfn++) {
+                       if (PageReserved(pfn_to_page(pfn)))
+                               reservedpages++;
+               }
+       }
+#else /* !CONFIG_DISCONTIGMEM */
+       for (pfn = 0; pfn < max_pfn; pfn++) {
                /*
                 * Only count reserved RAM pages
                 */
-               if (PageReserved(pfn_to_page(tmp)))
+               if (PageReserved(pfn_to_page(pfn)))
                        reservedpages++;
+       }
+#endif
+}
 
 #ifdef CONFIG_PA11
        if (hppa_dma_ops == &pcxl_dma_ops) {
@@ -494,20 +509,19 @@ void __init mem_init(void)
        vmalloc_start = SET_MAP_OFFSET(MAP_START);
 #endif
 
-       printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
-               (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
+       printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n",
+               (unsigned long)nr_free_pages() << (PAGE_SHIFT-10),
                num_physpages << (PAGE_SHIFT-10),
                codesize >> 10,
                reservedpages << (PAGE_SHIFT-10),
                datasize >> 10,
-               initsize >> 10,
-               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
-              );
+               initsize >> 10
+       );
 
 #ifdef CONFIG_DEBUG_KERNEL /* double-sanity-check paranoia */
        printk("virtual kernel memory layout:\n"
               "    vmalloc : 0x%p - 0x%p   (%4ld MB)\n"
-              "    lowmem  : 0x%p - 0x%p   (%4ld MB)\n"
+              "    memory  : 0x%p - 0x%p   (%4ld MB)\n"
               "      .init : 0x%p - 0x%p   (%4ld kB)\n"
               "      .data : 0x%p - 0x%p   (%4ld kB)\n"
               "      .text : 0x%p - 0x%p   (%4ld kB)\n",
@@ -518,14 +532,14 @@ void __init mem_init(void)
               __va(0), high_memory,
               ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20,
 
-              &__init_begin, &__init_end,
-              ((unsigned long)&__init_end - (unsigned long)&__init_begin) >> 10,
+              __init_begin, __init_end,
+              ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10,
 
-              &_etext, &_edata,
-              ((unsigned long)&_edata - (unsigned long)&_etext) >> 10,
+              _etext, _edata,
+              ((unsigned long)_edata - (unsigned long)_etext) >> 10,
 
-              &_text, &_etext,
-              ((unsigned long)&_etext - (unsigned long)&_text) >> 10);
+              _text, _etext,
+              ((unsigned long)_etext - (unsigned long)_text) >> 10);
 #endif
 }