Unevictable LRU Page Statistics

Report unevictable pages per zone and system wide.

Kosaki Motohiro added support for memory controller unevictable
statistics.

[riel@redhat.com: fix printk in show_free_areas()]
[akpm@linux-foundation.org: fix units in /proc/vmstats]
Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Debugged-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Lee Schermerhorn 2008-10-18 20:26:40 -07:00 committed by Linus Torvalds
parent bbfd28eee9
commit 7b854121eb
5 changed files with 37 additions and 2 deletions

View File

@ -70,6 +70,9 @@ static ssize_t node_read_meminfo(struct sys_device * dev,
"Node %d Inactive(anon): %8lu kB\n" "Node %d Inactive(anon): %8lu kB\n"
"Node %d Active(file): %8lu kB\n" "Node %d Active(file): %8lu kB\n"
"Node %d Inactive(file): %8lu kB\n" "Node %d Inactive(file): %8lu kB\n"
#ifdef CONFIG_UNEVICTABLE_LRU
"Node %d Noreclaim: %8lu kB\n"
#endif
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
"Node %d HighTotal: %8lu kB\n" "Node %d HighTotal: %8lu kB\n"
"Node %d HighFree: %8lu kB\n" "Node %d HighFree: %8lu kB\n"
@ -99,6 +102,9 @@ static ssize_t node_read_meminfo(struct sys_device * dev,
nid, K(node_page_state(nid, NR_INACTIVE_ANON)), nid, K(node_page_state(nid, NR_INACTIVE_ANON)),
nid, K(node_page_state(nid, NR_ACTIVE_FILE)), nid, K(node_page_state(nid, NR_ACTIVE_FILE)),
nid, K(node_page_state(nid, NR_INACTIVE_FILE)), nid, K(node_page_state(nid, NR_INACTIVE_FILE)),
#ifdef CONFIG_UNEVICTABLE_LRU
nid, K(node_page_state(nid, NR_UNEVICTABLE)),
#endif
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
nid, K(i.totalhigh), nid, K(i.totalhigh),
nid, K(i.freehigh), nid, K(i.freehigh),

View File

@ -174,6 +174,9 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
"Inactive(anon): %8lu kB\n" "Inactive(anon): %8lu kB\n"
"Active(file): %8lu kB\n" "Active(file): %8lu kB\n"
"Inactive(file): %8lu kB\n" "Inactive(file): %8lu kB\n"
#ifdef CONFIG_UNEVICTABLE_LRU
"Unevictable: %8lu kB\n"
#endif
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
"HighTotal: %8lu kB\n" "HighTotal: %8lu kB\n"
"HighFree: %8lu kB\n" "HighFree: %8lu kB\n"
@ -212,6 +215,9 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
K(pages[LRU_INACTIVE_ANON]), K(pages[LRU_INACTIVE_ANON]),
K(pages[LRU_ACTIVE_FILE]), K(pages[LRU_ACTIVE_FILE]),
K(pages[LRU_INACTIVE_FILE]), K(pages[LRU_INACTIVE_FILE]),
#ifdef CONFIG_UNEVICTABLE_LRU
K(pages[LRU_UNEVICTABLE]),
#endif
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
K(i.totalhigh), K(i.totalhigh),
K(i.freehigh), K(i.freehigh),

View File

@ -1006,6 +1006,7 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
{ {
unsigned long active_anon, inactive_anon; unsigned long active_anon, inactive_anon;
unsigned long active_file, inactive_file; unsigned long active_file, inactive_file;
unsigned long unevictable;
inactive_anon = mem_cgroup_get_all_zonestat(mem_cont, inactive_anon = mem_cgroup_get_all_zonestat(mem_cont,
LRU_INACTIVE_ANON); LRU_INACTIVE_ANON);
@ -1015,10 +1016,15 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
LRU_INACTIVE_FILE); LRU_INACTIVE_FILE);
active_file = mem_cgroup_get_all_zonestat(mem_cont, active_file = mem_cgroup_get_all_zonestat(mem_cont,
LRU_ACTIVE_FILE); LRU_ACTIVE_FILE);
unevictable = mem_cgroup_get_all_zonestat(mem_cont,
LRU_UNEVICTABLE);
cb->fill(cb, "active_anon", (active_anon) * PAGE_SIZE); cb->fill(cb, "active_anon", (active_anon) * PAGE_SIZE);
cb->fill(cb, "inactive_anon", (inactive_anon) * PAGE_SIZE); cb->fill(cb, "inactive_anon", (inactive_anon) * PAGE_SIZE);
cb->fill(cb, "active_file", (active_file) * PAGE_SIZE); cb->fill(cb, "active_file", (active_file) * PAGE_SIZE);
cb->fill(cb, "inactive_file", (inactive_file) * PAGE_SIZE); cb->fill(cb, "inactive_file", (inactive_file) * PAGE_SIZE);
cb->fill(cb, "unevictable", unevictable * PAGE_SIZE);
} }
return 0; return 0;
} }

View File

@ -1864,13 +1864,21 @@ void show_free_areas(void)
} }
} }
printk("Active_anon:%lu active_file:%lu inactive_anon%lu\n" printk("Active_anon:%lu active_file:%lu inactive_anon:%lu\n"
" inactive_file:%lu dirty:%lu writeback:%lu unstable:%lu\n" " inactive_file:%lu"
//TODO: check/adjust line lengths
#ifdef CONFIG_UNEVICTABLE_LRU
" unevictable:%lu"
#endif
" dirty:%lu writeback:%lu unstable:%lu\n"
" free:%lu slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n", " free:%lu slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n",
global_page_state(NR_ACTIVE_ANON), global_page_state(NR_ACTIVE_ANON),
global_page_state(NR_ACTIVE_FILE), global_page_state(NR_ACTIVE_FILE),
global_page_state(NR_INACTIVE_ANON), global_page_state(NR_INACTIVE_ANON),
global_page_state(NR_INACTIVE_FILE), global_page_state(NR_INACTIVE_FILE),
#ifdef CONFIG_UNEVICTABLE_LRU
global_page_state(NR_UNEVICTABLE),
#endif
global_page_state(NR_FILE_DIRTY), global_page_state(NR_FILE_DIRTY),
global_page_state(NR_WRITEBACK), global_page_state(NR_WRITEBACK),
global_page_state(NR_UNSTABLE_NFS), global_page_state(NR_UNSTABLE_NFS),
@ -1897,6 +1905,9 @@ void show_free_areas(void)
" inactive_anon:%lukB" " inactive_anon:%lukB"
" active_file:%lukB" " active_file:%lukB"
" inactive_file:%lukB" " inactive_file:%lukB"
#ifdef CONFIG_UNEVICTABLE_LRU
" unevictable:%lukB"
#endif
" present:%lukB" " present:%lukB"
" pages_scanned:%lu" " pages_scanned:%lu"
" all_unreclaimable? %s" " all_unreclaimable? %s"
@ -1910,6 +1921,9 @@ void show_free_areas(void)
K(zone_page_state(zone, NR_INACTIVE_ANON)), K(zone_page_state(zone, NR_INACTIVE_ANON)),
K(zone_page_state(zone, NR_ACTIVE_FILE)), K(zone_page_state(zone, NR_ACTIVE_FILE)),
K(zone_page_state(zone, NR_INACTIVE_FILE)), K(zone_page_state(zone, NR_INACTIVE_FILE)),
#ifdef CONFIG_UNEVICTABLE_LRU
K(zone_page_state(zone, NR_UNEVICTABLE)),
#endif
K(zone->present_pages), K(zone->present_pages),
zone->pages_scanned, zone->pages_scanned,
(zone_is_all_unreclaimable(zone) ? "yes" : "no") (zone_is_all_unreclaimable(zone) ? "yes" : "no")

View File

@ -623,6 +623,9 @@ static const char * const vmstat_text[] = {
"nr_active_anon", "nr_active_anon",
"nr_inactive_file", "nr_inactive_file",
"nr_active_file", "nr_active_file",
#ifdef CONFIG_UNEVICTABLE_LRU
"nr_unevictable",
#endif
"nr_anon_pages", "nr_anon_pages",
"nr_mapped", "nr_mapped",
"nr_file_pages", "nr_file_pages",