Commit 454c63b02e530f10b4345343f63596dd705888d0
Committed by
Linus Torvalds
1 parent
2c97b7fc0d
Exists in
master
and in
41 other branches
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
lib/Makefile
| ... | ... | @@ -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 |
lib/show_mem.c
| 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 | +} |