show_mem() for IA64 sparsemem NUMA
PATCH 1/1 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 George Beshers <[email protected]>
arch/ia64/mm/contig.c +48 -26
@@ -30,47 +30,69 @@#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 -show_mem (void ) +void show_mem (void ) { -int i, total =0 , reserved =0 ; -int shared =0 , cached =0 ; +int i, total_reserved =0 ; +int total_shared =0 , total_cached =0 ; +unsigned long total_present =0 ; +pg_data_t *pgdat;printk (KERN_INFO "Mem-info:\n" );show_free_areas (); -printk (KERN_INFO "Free swap: %6ldkB\n" , nr_swap_pages<<(PAGE_SHIFT -10 )); - i = max_mapnr; -for (i =0 ; i < max_mapnr; i++) { -if (!pfn_valid (i)) { +printk (KERN_INFO "Node memory in pages:\n" ); +for_each_online_pgdat (pgdat) { +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 -if (max_gap <LARGE_GAP ) -continue ; - i =vmemmap_find_next_valid_pfn (0 , i) -1 ; +if (max_gap <LARGE_GAP ) +continue ;#endif -continue ; + i =vmemmap_find_next_valid_pfn (pgdat->node_id, + i) -1 ; +continue ; + } +if (PageReserved (page)) + reserved++; +else if (PageSwapCache (page)) + cached++; +else if (page_count (page)) + shared +=page_count (page)-1 ; } - total++; -if (PageReserved (mem_map+i)) - reserved++; -else if (PageSwapCache (mem_map+i)) - cached++; -else if (page_count (mem_map + i)) - shared +=page_count (mem_map + i) -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 "%d reserved pages\n" , reserved); -printk (KERN_INFO "%d pages shared\n" , shared); -printk (KERN_INFO "%d pages swap cached\n" , cached); -printk (KERN_INFO "%ld pages in page table cache\n" , +printk (KERN_INFO "%ld pages of RAM\n" , total_present); +printk (KERN_INFO "%d reserved pages\n" , total_reserved); +printk (KERN_INFO "%d pages shared\n" , total_shared); +printk (KERN_INFO "%d pages swap cached\n" , total_cached); +printk (KERN_INFO "Total of %ld pages in page table cache\n" ,pgtable_quicklist_total_size ()); +printk (KERN_INFO "%d free buffer pages\n" ,nr_free_buffer_pages ()); } +/* physical address where the bootmem map is located */ unsigned long bootmap_start;