[ARM] mem_init(): make highmem pages available for use
authorNicolas Pitre <nico@cam.org>
Wed, 17 Sep 2008 19:21:55 +0000 (15:21 -0400)
committerNicolas Pitre <nico@cam.org>
Mon, 16 Mar 2009 01:01:21 +0000 (21:01 -0400)
Signed-off-by: Nicolas Pitre <nico@marvell.com>
arch/arm/mm/init.c

index 80fd3b6..8277802 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mman.h>
 #include <linux/nodemask.h>
 #include <linux/initrd.h>
+#include <linux/highmem.h>
 
 #include <asm/mach-types.h>
 #include <asm/sections.h>
@@ -485,7 +486,7 @@ void __init mem_init(void)
        int i, node;
 
 #ifndef CONFIG_DISCONTIGMEM
-       max_mapnr   = virt_to_page(high_memory) - mem_map;
+       max_mapnr   = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map;
 #endif
 
        /* this will put all unused low memory onto the freelists */
@@ -504,6 +505,19 @@ void __init mem_init(void)
                                    __phys_to_pfn(__pa(swapper_pg_dir)), NULL);
 #endif
 
+#ifdef CONFIG_HIGHMEM
+       /* set highmem page free */
+       for_each_online_node(node) {
+               for_each_nodebank (i, &meminfo, node) {
+                       unsigned long start = bank_pfn_start(&meminfo.bank[i]);
+                       unsigned long end = bank_pfn_end(&meminfo.bank[i]);
+                       if (start >= max_low_pfn + PHYS_PFN_OFFSET)
+                               totalhigh_pages += free_area(start, end, NULL);
+               }
+       }
+       totalram_pages += totalhigh_pages;
+#endif
+
        /*
         * Since our memory may not be contiguous, calculate the
         * real number of pages we have in this system
@@ -521,9 +535,10 @@ void __init mem_init(void)
        initsize = __init_end - __init_begin;
 
        printk(KERN_NOTICE "Memory: %luKB available (%dK code, "
-               "%dK data, %dK init)\n",
+               "%dK data, %dK init, %luK highmem)\n",
                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-               codesize >> 10, datasize >> 10, initsize >> 10);
+               codesize >> 10, datasize >> 10, initsize >> 10,
+               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)));
 
        if (PAGE_SIZE >= 16384 && num_physpages <= 128) {
                extern int sysctl_overcommit_memory;