Commit f1c0afa2 authored by George Beshers's avatar George Beshers Committed by Tony Luck

[IA64] show_mem() for IA64 sparsemem NUMA

On the ia64 architecture only this patch upgrades show_mem() for sparse
memory to be the same as it was for discontig memory.  It has been shown to
work on NUMA and flatmem architectures.
Signed-off-by: default avatarGeorge Beshers <gbeshers@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 671496af
...@@ -30,47 +30,69 @@ static unsigned long max_gap; ...@@ -30,47 +30,69 @@ static unsigned long max_gap;
#endif #endif
/** /**
* show_mem - display a memory statistics summary * show_mem - give short summary of memory stats
* *
* Just walks the pages in the system and describes where they're allocated. * Shows a simple page count of reserved and used pages in the system.
* For discontig machines, it does this on a per-pgdat basis.
*/ */
void void show_mem(void)
show_mem (void)
{ {
int i, total = 0, reserved = 0; int i, total_reserved = 0;
int shared = 0, cached = 0; int total_shared = 0, total_cached = 0;
unsigned long total_present = 0;
pg_data_t *pgdat;
printk(KERN_INFO "Mem-info:\n"); printk(KERN_INFO "Mem-info:\n");
show_free_areas(); show_free_areas();
printk(KERN_INFO "Free swap: %6ldkB\n", printk(KERN_INFO "Free swap: %6ldkB\n",
nr_swap_pages<<(PAGE_SHIFT-10)); nr_swap_pages<<(PAGE_SHIFT-10));
i = max_mapnr; printk(KERN_INFO "Node memory in pages:\n");
for (i = 0; i < max_mapnr; i++) { for_each_online_pgdat(pgdat) {
if (!pfn_valid(i)) { unsigned long present;
unsigned long flags;
int shared = 0, cached = 0, reserved = 0;
pgdat_resize_lock(pgdat, &flags);
present = pgdat->node_present_pages;
for(i = 0; i < pgdat->node_spanned_pages; i++) {
struct page *page;
if (pfn_valid(pgdat->node_start_pfn + i))
page = pfn_to_page(pgdat->node_start_pfn + i);
else {
#ifdef CONFIG_VIRTUAL_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP
if (max_gap < LARGE_GAP) if (max_gap < LARGE_GAP)
continue; continue;
i = vmemmap_find_next_valid_pfn(0, i) - 1;
#endif #endif
i = vmemmap_find_next_valid_pfn(pgdat->node_id,
i) - 1;
continue; continue;
} }
total++; if (PageReserved(page))
if (PageReserved(mem_map+i))
reserved++; reserved++;
else if (PageSwapCache(mem_map+i)) else if (PageSwapCache(page))
cached++; cached++;
else if (page_count(mem_map + i)) else if (page_count(page))
shared += page_count(mem_map + i) - 1; shared += page_count(page)-1;
}
pgdat_resize_unlock(pgdat, &flags);
total_present += present;
total_reserved += reserved;
total_cached += cached;
total_shared += shared;
printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, "
"shrd: %10d, swpd: %10d\n", pgdat->node_id,
present, reserved, shared, cached);
} }
printk(KERN_INFO "%d pages of RAM\n", total); printk(KERN_INFO "%ld pages of RAM\n", total_present);
printk(KERN_INFO "%d reserved pages\n", reserved); printk(KERN_INFO "%d reserved pages\n", total_reserved);
printk(KERN_INFO "%d pages shared\n", shared); printk(KERN_INFO "%d pages shared\n", total_shared);
printk(KERN_INFO "%d pages swap cached\n", cached); printk(KERN_INFO "%d pages swap cached\n", total_cached);
printk(KERN_INFO "%ld pages in page table cache\n", printk(KERN_INFO "Total of %ld pages in page table cache\n",
pgtable_quicklist_total_size()); pgtable_quicklist_total_size());
printk(KERN_INFO "%d free buffer pages\n", nr_free_buffer_pages());
} }
/* physical address where the bootmem map is located */ /* physical address where the bootmem map is located */
unsigned long bootmap_start; unsigned long bootmap_start;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment