Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[pandora-kernel.git] / arch / arm / mm / init.c
index 22217fe..7760193 100644 (file)
@@ -32,40 +32,54 @@ extern unsigned long phys_initrd_start;
 extern unsigned long phys_initrd_size;
 
 /*
- * The sole use of this is to pass memory configuration
- * data from paging_init to mem_init.
+ * This is used to pass memory configuration data from paging_init
+ * to mem_init, and by show_mem() to skip holes in the memory map.
  */
-static struct meminfo meminfo __initdata = { 0, };
+static struct meminfo meminfo = { 0, };
+
+#define for_each_nodebank(iter,mi,no)                  \
+       for (iter = 0; iter < mi->nr_banks; iter++)     \
+               if (mi->bank[iter].node == no)
 
 void show_mem(void)
 {
        int free = 0, total = 0, reserved = 0;
-       int shared = 0, cached = 0, slab = 0, node;
+       int shared = 0, cached = 0, slab = 0, node, i;
+       struct meminfo * mi = &meminfo;
 
        printk("Mem-info:\n");
        show_free_areas();
        printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
 
        for_each_online_node(node) {
-               struct page *page, *end;
-
-               page = NODE_MEM_MAP(node);
-               end  = page + NODE_DATA(node)->node_spanned_pages;
-
-               do {
-                       total++;
-                       if (PageReserved(page))
-                               reserved++;
-                       else if (PageSwapCache(page))
-                               cached++;
-                       else if (PageSlab(page))
-                               slab++;
-                       else if (!page_count(page))
-                               free++;
-                       else
-                               shared += page_count(page) - 1;
-                       page++;
-               } while (page < end);
+               pg_data_t *n = NODE_DATA(node);
+               struct page *map = n->node_mem_map - n->node_start_pfn;
+
+               for_each_nodebank (i,mi,node) {
+                       unsigned int pfn1, pfn2;
+                       struct page *page, *end;
+
+                       pfn1 = __phys_to_pfn(mi->bank[i].start);
+                       pfn2 = __phys_to_pfn(mi->bank[i].size + mi->bank[i].start);
+
+                       page = map + pfn1;
+                       end  = map + pfn2;
+
+                       do {
+                               total++;
+                               if (PageReserved(page))
+                                       reserved++;
+                               else if (PageSwapCache(page))
+                                       cached++;
+                               else if (PageSlab(page))
+                                       slab++;
+                               else if (!page_count(page))
+                                       free++;
+                               else
+                                       shared += page_count(page) - 1;
+                               page++;
+                       } while (page < end);
+               }
        }
 
        printk("%d pages of RAM\n", total);
@@ -76,10 +90,6 @@ void show_mem(void)
        printk("%d pages swap cached\n", cached);
 }
 
-#define for_each_nodebank(iter,mi,no)                  \
-       for (iter = 0; iter < mi->nr_banks; iter++)     \
-               if (mi->bank[iter].node == no)
-
 /*
  * FIXME: We really want to avoid allocating the bootmap bitmap
  * over the top of the initrd.  Hopefully, this is located towards