aboutsummaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-06-30 01:55:36 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-30 11:25:35 -0700
commitf3dbd34460ff54962d3e3244b6bcb7f5295356e6 (patch)
tree91caae2b90d684a7640b5da451a9a2ff8a5c8fb8 /mm
parentbf02cf4b6cf931d060ad5c6ce9b960af6faefd2d (diff)
[PATCH] zoned vm counters: split NR_ANON_PAGES off from NR_FILE_MAPPED
The current NR_FILE_MAPPED is used by zone reclaim and the dirty load calculation as the number of mapped pagecache pages. However, that is not true. NR_FILE_MAPPED includes the mapped anonymous pages. This patch separates those and therefore allows an accurate tracking of the anonymous pages per zone. It then becomes possible to determine the number of unmapped pages per zone and we can avoid scanning for unmapped pages if there are none. Also it may now be possible to determine the mapped/unmapped ratio in get_dirty_limit. Isnt the number of anonymous pages irrelevant in that calculation? Note that this will change the meaning of the number of mapped pages reported in /proc/vmstat /proc/meminfo and in the per node statistics. This may affect user space tools that monitor these counters! NR_FILE_MAPPED works like NR_FILE_DIRTY. It is only valid for pagecache pages. Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Trond Myklebust <trond.myklebust@fys.uio.no> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/page-writeback.c3
-rw-r--r--mm/rmap.c5
-rw-r--r--mm/vmscan.c3
-rw-r--r--mm/vmstat.c1
4 files changed, 8 insertions, 4 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 60c7244c42e..0faacfe1890 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -111,7 +111,8 @@ static void get_writeback_state(struct writeback_state *wbs)
{
wbs->nr_dirty = read_page_state(nr_dirty);
wbs->nr_unstable = read_page_state(nr_unstable);
- wbs->nr_mapped = global_page_state(NR_FILE_MAPPED);
+ wbs->nr_mapped = global_page_state(NR_FILE_MAPPED) +
+ global_page_state(NR_ANON_PAGES);
wbs->nr_writeback = read_page_state(nr_writeback);
}
diff --git a/mm/rmap.c b/mm/rmap.c
index af5e9808e65..40158b59729 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -455,7 +455,7 @@ static void __page_set_anon_rmap(struct page *page,
* nr_mapped state can be updated without turning off
* interrupts because it is not modified via interrupt.
*/
- __inc_zone_page_state(page, NR_FILE_MAPPED);
+ __inc_zone_page_state(page, NR_ANON_PAGES);
}
/**
@@ -531,7 +531,8 @@ void page_remove_rmap(struct page *page)
*/
if (page_test_and_clear_dirty(page))
set_page_dirty(page);
- __dec_zone_page_state(page, NR_FILE_MAPPED);
+ __dec_zone_page_state(page,
+ PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED);
}
}
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 08bc54e8086..2f0390161c0 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -742,7 +742,8 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
* how much memory
* is mapped.
*/
- mapped_ratio = (global_page_state(NR_FILE_MAPPED) * 100) /
+ mapped_ratio = ((global_page_state(NR_FILE_MAPPED) +
+ global_page_state(NR_ANON_PAGES)) * 100) /
vm_total_pages;
/*
diff --git a/mm/vmstat.c b/mm/vmstat.c
index f16b33eb6d5..3baf4dffa62 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -395,6 +395,7 @@ struct seq_operations fragmentation_op = {
static char *vmstat_text[] = {
/* Zoned VM counters */
+ "nr_anon_pages",
"nr_mapped",
"nr_file_pages",