diff options
Diffstat (limited to 'lib/show_mem.c')
-rw-r--r-- | lib/show_mem.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/lib/show_mem.c b/lib/show_mem.c index 5847a49..b7c7231 100644 --- a/lib/show_mem.c +++ b/lib/show_mem.c @@ -12,7 +12,8 @@ void show_mem(unsigned int filter) { pg_data_t *pgdat; - unsigned long total = 0, reserved = 0, highmem = 0; + unsigned long total = 0, reserved = 0, shared = 0, + nonshared = 0, highmem = 0; printk("Mem-Info:\n"); show_free_areas(filter); @@ -21,27 +22,43 @@ void show_mem(unsigned int filter) return; for_each_online_pgdat(pgdat) { - unsigned long flags; - int zoneid; + unsigned long i, flags; pgdat_resize_lock(pgdat, &flags); - for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { - struct zone *zone = &pgdat->node_zones[zoneid]; - if (!populated_zone(zone)) + 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; - total += zone->present_pages; - reserved = zone->present_pages - zone->managed_pages; + page = pfn_to_page(pfn); + + if (PageHighMem(page)) + highmem++; - if (is_highmem_idx(zoneid)) - highmem += zone->present_pages; + 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); } printk("%lu pages RAM\n", total); - printk("%lu pages HighMem/MovableOnly\n", highmem); +#ifdef CONFIG_HIGHMEM + printk("%lu pages HighMem\n", highmem); +#endif printk("%lu pages reserved\n", reserved); + printk("%lu pages shared\n", shared); + printk("%lu pages non-shared\n", nonshared); #ifdef CONFIG_QUICKLIST printk("%lu pages in pagetable cache\n", quicklist_total_size()); |