Commit 454c63b02e530f10b4345343f63596dd705888d0
Committed by
Linus Torvalds
1 parent
2c97b7fc0d
Exists in
master
and in
39 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 Inline Diff
lib/Makefile
1 | # | 1 | # |
2 | # Makefile for some libs needed in the kernel. | 2 | # Makefile for some libs needed in the kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | ifdef CONFIG_FTRACE | 5 | ifdef CONFIG_FTRACE |
6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) | 7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) |
8 | endif | 8 | endif |
9 | 9 | ||
10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ | 10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ |
11 | rbtree.o radix-tree.o dump_stack.o \ | 11 | rbtree.o radix-tree.o dump_stack.o \ |
12 | idr.o int_sqrt.o extable.o prio_tree.o \ | 12 | idr.o int_sqrt.o extable.o prio_tree.o \ |
13 | sha1.o irq_regs.o reciprocal_div.o argv_split.o \ | 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 | lib-$(CONFIG_MMU) += ioremap.o | 16 | lib-$(CONFIG_MMU) += ioremap.o |
17 | lib-$(CONFIG_SMP) += cpumask.o | 17 | lib-$(CONFIG_SMP) += cpumask.o |
18 | 18 | ||
19 | lib-y += kobject.o kref.o klist.o | 19 | lib-y += kobject.o kref.o klist.o |
20 | 20 | ||
21 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | 21 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
22 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o | 22 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o |
23 | 23 | ||
24 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | 24 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) |
25 | CFLAGS_kobject.o += -DDEBUG | 25 | CFLAGS_kobject.o += -DDEBUG |
26 | CFLAGS_kobject_uevent.o += -DDEBUG | 26 | CFLAGS_kobject_uevent.o += -DDEBUG |
27 | endif | 27 | endif |
28 | 28 | ||
29 | lib-$(CONFIG_HOTPLUG) += kobject_uevent.o | 29 | lib-$(CONFIG_HOTPLUG) += kobject_uevent.o |
30 | obj-$(CONFIG_GENERIC_IOMAP) += iomap.o | 30 | obj-$(CONFIG_GENERIC_IOMAP) += iomap.o |
31 | obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o | 31 | obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o |
32 | obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o | 32 | obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o |
33 | obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o | 33 | obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o |
34 | obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o | 34 | obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o |
35 | lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o | 35 | lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o |
36 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o | 36 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o |
37 | lib-$(CONFIG_GENERIC_FIND_FIRST_BIT) += find_next_bit.o | 37 | lib-$(CONFIG_GENERIC_FIND_FIRST_BIT) += find_next_bit.o |
38 | lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o | 38 | lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o |
39 | obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o | 39 | obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o |
40 | obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o | 40 | obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o |
41 | obj-$(CONFIG_PLIST) += plist.o | 41 | obj-$(CONFIG_PLIST) += plist.o |
42 | obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o | 42 | obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o |
43 | obj-$(CONFIG_DEBUG_LIST) += list_debug.o | 43 | obj-$(CONFIG_DEBUG_LIST) += list_debug.o |
44 | obj-$(CONFIG_DEBUG_OBJECTS) += debugobjects.o | 44 | obj-$(CONFIG_DEBUG_OBJECTS) += debugobjects.o |
45 | 45 | ||
46 | ifneq ($(CONFIG_HAVE_DEC_LOCK),y) | 46 | ifneq ($(CONFIG_HAVE_DEC_LOCK),y) |
47 | lib-y += dec_and_lock.o | 47 | lib-y += dec_and_lock.o |
48 | endif | 48 | endif |
49 | 49 | ||
50 | obj-$(CONFIG_BITREVERSE) += bitrev.o | 50 | obj-$(CONFIG_BITREVERSE) += bitrev.o |
51 | obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o | 51 | obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o |
52 | obj-$(CONFIG_CRC16) += crc16.o | 52 | obj-$(CONFIG_CRC16) += crc16.o |
53 | obj-$(CONFIG_CRC_T10DIF)+= crc-t10dif.o | 53 | obj-$(CONFIG_CRC_T10DIF)+= crc-t10dif.o |
54 | obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o | 54 | obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o |
55 | obj-$(CONFIG_CRC32) += crc32.o | 55 | obj-$(CONFIG_CRC32) += crc32.o |
56 | obj-$(CONFIG_CRC7) += crc7.o | 56 | obj-$(CONFIG_CRC7) += crc7.o |
57 | obj-$(CONFIG_LIBCRC32C) += libcrc32c.o | 57 | obj-$(CONFIG_LIBCRC32C) += libcrc32c.o |
58 | obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o | 58 | obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o |
59 | 59 | ||
60 | obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/ | 60 | obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/ |
61 | obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate/ | 61 | obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate/ |
62 | obj-$(CONFIG_REED_SOLOMON) += reed_solomon/ | 62 | obj-$(CONFIG_REED_SOLOMON) += reed_solomon/ |
63 | obj-$(CONFIG_LZO_COMPRESS) += lzo/ | 63 | obj-$(CONFIG_LZO_COMPRESS) += lzo/ |
64 | obj-$(CONFIG_LZO_DECOMPRESS) += lzo/ | 64 | obj-$(CONFIG_LZO_DECOMPRESS) += lzo/ |
65 | 65 | ||
66 | obj-$(CONFIG_TEXTSEARCH) += textsearch.o | 66 | obj-$(CONFIG_TEXTSEARCH) += textsearch.o |
67 | obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o | 67 | obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o |
68 | obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o | 68 | obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o |
69 | obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o | 69 | obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o |
70 | obj-$(CONFIG_SMP) += percpu_counter.o | 70 | obj-$(CONFIG_SMP) += percpu_counter.o |
71 | obj-$(CONFIG_AUDIT_GENERIC) += audit.o | 71 | obj-$(CONFIG_AUDIT_GENERIC) += audit.o |
72 | 72 | ||
73 | obj-$(CONFIG_SWIOTLB) += swiotlb.o | 73 | obj-$(CONFIG_SWIOTLB) += swiotlb.o |
74 | obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o | 74 | obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o |
75 | obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o | 75 | obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o |
76 | 76 | ||
77 | lib-$(CONFIG_GENERIC_BUG) += bug.o | 77 | lib-$(CONFIG_GENERIC_BUG) += bug.o |
78 | 78 | ||
79 | obj-$(CONFIG_HAVE_LMB) += lmb.o | 79 | obj-$(CONFIG_HAVE_LMB) += lmb.o |
80 | 80 | ||
81 | obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o | 81 | obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o |
82 | 82 | ||
83 | hostprogs-y := gen_crc32table | 83 | hostprogs-y := gen_crc32table |
84 | clean-files := crc32table.h | 84 | clean-files := crc32table.h |
85 | 85 | ||
86 | $(obj)/crc32.o: $(obj)/crc32table.h | 86 | $(obj)/crc32.o: $(obj)/crc32table.h |
87 | 87 | ||
88 | quiet_cmd_crc32 = GEN $@ | 88 | quiet_cmd_crc32 = GEN $@ |
89 | cmd_crc32 = $< > $@ | 89 | cmd_crc32 = $< > $@ |
90 | 90 | ||
91 | $(obj)/crc32table.h: $(obj)/gen_crc32table | 91 | $(obj)/crc32table.h: $(obj)/gen_crc32table |
92 | $(call cmd,crc32) | 92 | $(call cmd,crc32) |
93 | 93 |
lib/show_mem.c
File was created | 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 | } | ||
64 |