arch, mm: filter disallowed nodes from arch specific show_mem functions
David Rientjes [Wed, 25 May 2011 00:11:16 +0000 (17:11 -0700)]
Architectures that implement their own show_mem() function did not pass
the filter argument to show_free_areas() to appropriately avoid emitting
the state of nodes that are disallowed in the current context.  This patch
now passes the filter argument to show_free_areas() so those nodes are now
avoided.

This patch also removes the show_free_areas() wrapper around
__show_free_areas() and converts existing callers to pass an empty filter.

ia64 emits additional information for each node, so skip_free_areas_zone()
must be made global to filter disallowed nodes and it is converted to use
a nid argument rather than a zone for this use case.

Signed-off-by: David Rientjes <rientjes@google.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Helge Deller <deller@gmx.de>
Cc: James Bottomley <jejb@parisc-linux.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

13 files changed:
arch/arm/mm/init.c
arch/ia64/mm/contig.c
arch/ia64/mm/discontig.c
arch/parisc/mm/init.c
arch/sparc/kernel/setup_32.c
arch/sparc/mm/init_32.c
arch/unicore32/mm/init.c
drivers/net/ioc3-eth.c
drivers/tty/serial/68328serial.c
include/linux/mm.h
lib/show_mem.c
mm/nommu.c
mm/page_alloc.c

index 76f82ae..3f17ea1 100644 (file)
@@ -85,7 +85,7 @@ void show_mem(unsigned int filter)
        struct meminfo * mi = &meminfo;
 
        printk("Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
 
        for_each_bank (i, mi) {
                struct membank *bank = &mi->bank[i];
index 9a018cd..f114a3b 100644 (file)
@@ -44,13 +44,16 @@ void show_mem(unsigned int filter)
        pg_data_t *pgdat;
 
        printk(KERN_INFO "Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
        printk(KERN_INFO "Node memory in pages:\n");
        for_each_online_pgdat(pgdat) {
                unsigned long present;
                unsigned long flags;
                int shared = 0, cached = 0, reserved = 0;
+               int nid = pgdat->node_id;
 
+               if (skip_free_areas_node(filter, nid))
+                       continue;
                pgdat_resize_lock(pgdat, &flags);
                present = pgdat->node_present_pages;
                for(i = 0; i < pgdat->node_spanned_pages; i++) {
@@ -64,8 +67,7 @@ void show_mem(unsigned int filter)
                                if (max_gap < LARGE_GAP)
                                        continue;
 #endif
-                               i = vmemmap_find_next_valid_pfn(pgdat->node_id,
-                                        i) - 1;
+                               i = vmemmap_find_next_valid_pfn(nid, i) - 1;
                                continue;
                        }
                        if (PageReserved(page))
@@ -81,7 +83,7 @@ void show_mem(unsigned int filter)
                total_cached += cached;
                total_shared += shared;
                printk(KERN_INFO "Node %4d:  RAM: %11ld, rsvd: %8d, "
-                      "shrd: %10d, swpd: %10d\n", pgdat->node_id,
+                      "shrd: %10d, swpd: %10d\n", nid,
                       present, reserved, shared, cached);
        }
        printk(KERN_INFO "%ld pages of RAM\n", total_present);
index 82ab1bc..c641333 100644 (file)
@@ -622,13 +622,16 @@ void show_mem(unsigned int filter)
        pg_data_t *pgdat;
 
        printk(KERN_INFO "Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
        printk(KERN_INFO "Node memory in pages:\n");
        for_each_online_pgdat(pgdat) {
                unsigned long present;
                unsigned long flags;
                int shared = 0, cached = 0, reserved = 0;
+               int nid = pgdat->node_id;
 
+               if (skip_free_areas_node(filter, nid))
+                       continue;
                pgdat_resize_lock(pgdat, &flags);
                present = pgdat->node_present_pages;
                for(i = 0; i < pgdat->node_spanned_pages; i++) {
@@ -638,8 +641,7 @@ void show_mem(unsigned int filter)
                        if (pfn_valid(pgdat->node_start_pfn + i))
                                page = pfn_to_page(pgdat->node_start_pfn + i);
                        else {
-                               i = vmemmap_find_next_valid_pfn(pgdat->node_id,
-                                        i) - 1;
+                               i = vmemmap_find_next_valid_pfn(nid, i) - 1;
                                continue;
                        }
                        if (PageReserved(page))
@@ -655,7 +657,7 @@ void show_mem(unsigned int filter)
                total_cached += cached;
                total_shared += shared;
                printk(KERN_INFO "Node %4d:  RAM: %11ld, rsvd: %8d, "
-                      "shrd: %10d, swpd: %10d\n", pgdat->node_id,
+                      "shrd: %10d, swpd: %10d\n", nid,
                       present, reserved, shared, cached);
        }
        printk(KERN_INFO "%ld pages of RAM\n", total_present);
index 5fa1e27..c5c9c65 100644 (file)
@@ -686,7 +686,7 @@ void show_mem(unsigned int filter)
        int shared = 0, cached = 0;
 
        printk(KERN_INFO "Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
 #ifndef CONFIG_DISCONTIGMEM
        i = max_mapnr;
        while (i-- > 0) {
index 3609bde..3249d3f 100644 (file)
@@ -82,7 +82,7 @@ static void prom_sync_me(void)
                             "nop\n\t" : : "r" (&trapbase));
 
        prom_printf("PROM SYNC COMMAND...\n");
-       show_free_areas();
+       show_free_areas(0);
        if(current->pid != 0) {
                local_irq_enable();
                sys_sync();
index 4c31e2b..28c2cc8 100644 (file)
@@ -78,7 +78,7 @@ void __init kmap_init(void)
 void show_mem(unsigned int filter)
 {
        printk("Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
        printk("Free swap:       %6ldkB\n",
               nr_swap_pages << (PAGE_SHIFT-10));
        printk("%ld pages of RAM\n", totalram_pages);
index 1fc0263..2d3e711 100644 (file)
@@ -62,7 +62,7 @@ void show_mem(unsigned int filter)
        struct meminfo *mi = &meminfo;
 
        printk(KERN_DEFAULT "Mem-info:\n");
-       show_free_areas();
+       show_free_areas(filter);
 
        for_each_bank(i, mi) {
                struct membank *bank = &mi->bank[i];
index 96c9561..32f07f8 100644 (file)
@@ -915,7 +915,7 @@ static void ioc3_alloc_rings(struct net_device *dev)
 
                        skb = ioc3_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
                        if (!skb) {
-                               show_free_areas();
+                               show_free_areas(0);
                                continue;
                        }
 
index d5bfd41..e0a7754 100644 (file)
@@ -281,7 +281,7 @@ static void receive_chars(struct m68k_serial *info, unsigned short rx)
 #ifdef CONFIG_MAGIC_SYSRQ
                        } else if (ch == 0x10) { /* ^P */
                                show_state();
-                               show_free_areas();
+                               show_free_areas(0);
                                show_buffers();
 /*                             show_net_buffers(); */
                                return;
index 6507dde..1746f67 100644 (file)
@@ -862,13 +862,13 @@ extern void pagefault_out_of_memory(void);
 #define offset_in_page(p)      ((unsigned long)(p) & ~PAGE_MASK)
 
 /*
- * Flags passed to show_mem() and __show_free_areas() to suppress output in
+ * Flags passed to show_mem() and show_free_areas() to suppress output in
  * various contexts.
  */
 #define SHOW_MEM_FILTER_NODES  (0x0001u)       /* filter disallowed nodes */
 
-extern void show_free_areas(void);
-extern void __show_free_areas(unsigned int flags);
+extern void show_free_areas(unsigned int flags);
+extern bool skip_free_areas_node(unsigned int flags, int nid);
 
 int shmem_lock(struct file *file, int lock, struct user_struct *user);
 struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
index 90cbe4b..4407f8c 100644 (file)
@@ -16,7 +16,7 @@ void show_mem(unsigned int filter)
                nonshared = 0, highmem = 0;
 
        printk("Mem-Info:\n");
-       __show_free_areas(filter);
+       show_free_areas(filter);
 
        for_each_online_pgdat(pgdat) {
                unsigned long i, flags;
index c4c542c..5afce48 100644 (file)
@@ -1235,7 +1235,7 @@ error_free:
 enomem:
        printk("Allocation of length %lu from process %d (%s) failed\n",
               len, current->pid, current->comm);
-       show_free_areas();
+       show_free_areas(0);
        return -ENOMEM;
 }
 
@@ -1468,14 +1468,14 @@ error_getting_vma:
        printk(KERN_WARNING "Allocation of vma for %lu byte allocation"
               " from process %d failed\n",
               len, current->pid);
-       show_free_areas();
+       show_free_areas(0);
        return -ENOMEM;
 
 error_getting_region:
        printk(KERN_WARNING "Allocation of vm region for %lu byte allocation"
               " from process %d failed\n",
               len, current->pid);
-       show_free_areas();
+       show_free_areas(0);
        return -ENOMEM;
 }
 EXPORT_SYMBOL(do_mmap_pgoff);
index 9d5498e..b144752 100644 (file)
@@ -2473,10 +2473,10 @@ void si_meminfo_node(struct sysinfo *val, int nid)
 #endif
 
 /*
- * Determine whether the zone's node should be displayed or not, depending on
- * whether SHOW_MEM_FILTER_NODES was passed to __show_free_areas().
+ * Determine whether the node should be displayed or not, depending on whether
+ * SHOW_MEM_FILTER_NODES was passed to show_free_areas().
  */
-static bool skip_free_areas_zone(unsigned int flags, const struct zone *zone)
+bool skip_free_areas_node(unsigned int flags, int nid)
 {
        bool ret = false;
 
@@ -2484,8 +2484,7 @@ static bool skip_free_areas_zone(unsigned int flags, const struct zone *zone)
                goto out;
 
        get_mems_allowed();
-       ret = !node_isset(zone->zone_pgdat->node_id,
-                               cpuset_current_mems_allowed);
+       ret = !node_isset(nid, cpuset_current_mems_allowed);
        put_mems_allowed();
 out:
        return ret;
@@ -2500,13 +2499,13 @@ out:
  * Suppresses nodes that are not allowed by current's cpuset if
  * SHOW_MEM_FILTER_NODES is passed.
  */
-void __show_free_areas(unsigned int filter)
+void show_free_areas(unsigned int filter)
 {
        int cpu;
        struct zone *zone;
 
        for_each_populated_zone(zone) {
-               if (skip_free_areas_zone(filter, zone))
+               if (skip_free_areas_node(filter, zone_to_nid(zone)))
                        continue;
                show_node(zone);
                printk("%s per-cpu:\n", zone->name);
@@ -2549,7 +2548,7 @@ void __show_free_areas(unsigned int filter)
        for_each_populated_zone(zone) {
                int i;
 
-               if (skip_free_areas_zone(filter, zone))
+               if (skip_free_areas_node(filter, zone_to_nid(zone)))
                        continue;
                show_node(zone);
                printk("%s"
@@ -2618,7 +2617,7 @@ void __show_free_areas(unsigned int filter)
        for_each_populated_zone(zone) {
                unsigned long nr[MAX_ORDER], flags, order, total = 0;
 
-               if (skip_free_areas_zone(filter, zone))
+               if (skip_free_areas_node(filter, zone_to_nid(zone)))
                        continue;
                show_node(zone);
                printk("%s: ", zone->name);
@@ -2639,11 +2638,6 @@ void __show_free_areas(unsigned int filter)
        show_swap_cache_info();
 }
 
-void show_free_areas(void)
-{
-       __show_free_areas(0);
-}
-
 static void zoneref_set_zone(struct zone *zone, struct zoneref *zoneref)
 {
        zoneref->zone = zone;