[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: George Beshers <gbeshers@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
Родитель
671496affd
Коммит
f1c0afa2e8
|
@ -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
|
||||||
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++;
|
pgdat_resize_unlock(pgdat, &flags);
|
||||||
if (PageReserved(mem_map+i))
|
total_present += present;
|
||||||
reserved++;
|
total_reserved += reserved;
|
||||||
else if (PageSwapCache(mem_map+i))
|
total_cached += cached;
|
||||||
cached++;
|
total_shared += shared;
|
||||||
else if (page_count(mem_map + i))
|
printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, "
|
||||||
shared += page_count(mem_map + i) - 1;
|
"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;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче