show_mem.c 1.39 KB
Newer Older
Johannes Weiner's avatar
Johannes Weiner committed
1 2 3 4 5 6 7 8 9 10 11
/*
 * Generic show_mem() implementation
 *
 * Copyright (C) 2008 Johannes Weiner <hannes@saeurebad.de>
 * All code subject to the GPL version 2.
 */

#include <linux/mm.h>
#include <linux/nmi.h>
#include <linux/quicklist.h>

12
void show_mem(unsigned int filter)
Johannes Weiner's avatar
Johannes Weiner committed
13 14 15 16 17
{
	pg_data_t *pgdat;
	unsigned long total = 0, reserved = 0, shared = 0,
		nonshared = 0, highmem = 0;

18
	printk("Mem-Info:\n");
19
	show_free_areas(filter);
Johannes Weiner's avatar
Johannes Weiner committed
20

21 22 23
	if (filter & SHOW_MEM_FILTER_PAGE_COUNT)
		return;

Johannes Weiner's avatar
Johannes Weiner committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
	for_each_online_pgdat(pgdat) {
		unsigned long i, flags;

		pgdat_resize_lock(pgdat, &flags);
		for (i = 0; i < pgdat->node_spanned_pages; i++) {
			struct page *page;
			unsigned long pfn = pgdat->node_start_pfn + i;

			if (unlikely(!(i % MAX_ORDER_NR_PAGES)))
				touch_nmi_watchdog();

			if (!pfn_valid(pfn))
				continue;

			page = pfn_to_page(pfn);

			if (PageHighMem(page))
				highmem++;

			if (PageReserved(page))
				reserved++;
			else if (page_count(page) == 1)
				nonshared++;
			else if (page_count(page) > 1)
				shared += page_count(page) - 1;

			total++;
		}
		pgdat_resize_unlock(pgdat, &flags);
	}

55
	printk("%lu pages RAM\n", total);
Johannes Weiner's avatar
Johannes Weiner committed
56
#ifdef CONFIG_HIGHMEM
57
	printk("%lu pages HighMem\n", highmem);
Johannes Weiner's avatar
Johannes Weiner committed
58
#endif
59 60 61
	printk("%lu pages reserved\n", reserved);
	printk("%lu pages shared\n", shared);
	printk("%lu pages non-shared\n", nonshared);
Johannes Weiner's avatar
Johannes Weiner committed
62
#ifdef CONFIG_QUICKLIST
63
	printk("%lu pages in pagetable cache\n",
Johannes Weiner's avatar
Johannes Weiner committed
64 65 66
		quicklist_total_size());
#endif
}