Commit 454c63b02e530f10b4345343f63596dd705888d0

Authored by Johannes Weiner
Committed by Linus Torvalds
1 parent 2c97b7fc0d

lib: generic show_mem()

This implements a platform-independent version of show_mem().

Signed-off-by: Johannes Weiner <hannes@saeurebad.de>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Bryan Wu <cooloney@kernel.org>
Cc: Chris Zankel <chris@zankel.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Greg Ungerer <gerg@uclinux.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Mikael Starvik <starvik@axis.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 2 changed files with 64 additions and 1 deletions Side-by-side Diff

... ... @@ -11,7 +11,7 @@
11 11 rbtree.o radix-tree.o dump_stack.o \
12 12 idr.o int_sqrt.o extable.o prio_tree.o \
13 13 sha1.o irq_regs.o reciprocal_div.o argv_split.o \
14   - proportions.o prio_heap.o ratelimit.o
  14 + proportions.o prio_heap.o ratelimit.o show_mem.o
15 15  
16 16 lib-$(CONFIG_MMU) += ioremap.o
17 17 lib-$(CONFIG_SMP) += cpumask.o
  1 +/*
  2 + * Generic show_mem() implementation
  3 + *
  4 + * Copyright (C) 2008 Johannes Weiner <hannes@saeurebad.de>
  5 + * All code subject to the GPL version 2.
  6 + */
  7 +
  8 +#include <linux/mm.h>
  9 +#include <linux/nmi.h>
  10 +#include <linux/quicklist.h>
  11 +
  12 +void show_mem(void)
  13 +{
  14 + pg_data_t *pgdat;
  15 + unsigned long total = 0, reserved = 0, shared = 0,
  16 + nonshared = 0, highmem = 0;
  17 +
  18 + printk(KERN_INFO "Mem-Info:\n");
  19 + show_free_areas();
  20 +
  21 + for_each_online_pgdat(pgdat) {
  22 + unsigned long i, flags;
  23 +
  24 + pgdat_resize_lock(pgdat, &flags);
  25 + for (i = 0; i < pgdat->node_spanned_pages; i++) {
  26 + struct page *page;
  27 + unsigned long pfn = pgdat->node_start_pfn + i;
  28 +
  29 + if (unlikely(!(i % MAX_ORDER_NR_PAGES)))
  30 + touch_nmi_watchdog();
  31 +
  32 + if (!pfn_valid(pfn))
  33 + continue;
  34 +
  35 + page = pfn_to_page(pfn);
  36 +
  37 + if (PageHighMem(page))
  38 + highmem++;
  39 +
  40 + if (PageReserved(page))
  41 + reserved++;
  42 + else if (page_count(page) == 1)
  43 + nonshared++;
  44 + else if (page_count(page) > 1)
  45 + shared += page_count(page) - 1;
  46 +
  47 + total++;
  48 + }
  49 + pgdat_resize_unlock(pgdat, &flags);
  50 + }
  51 +
  52 + printk(KERN_INFO "%lu pages RAM\n", total);
  53 +#ifdef CONFIG_HIGHMEM
  54 + printk(KERN_INFO "%lu pages HighMem\n", highmem);
  55 +#endif
  56 + printk(KERN_INFO "%lu pages reserved\n", reserved);
  57 + printk(KERN_INFO "%lu pages shared\n", shared);
  58 + printk(KERN_INFO "%lu pages non-shared\n", nonshared);
  59 +#ifdef CONFIG_QUICKLIST
  60 + printk(KERN_INFO "%lu pages in pagetable cache\n",
  61 + quicklist_total_size());
  62 +#endif
  63 +}