summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-04-23 14:41:09 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2007-05-01 17:06:01 -0700
commit637fc7e479a60ae55357c0e3ffeca5a475ef5733 (patch)
treea1775a46b6442316ab4dba3b80a748880aa68dd4
parentaad6bcca0b1ca356ede42583c96dc7ada541cffe (diff)
downloadlwn-637fc7e479a60ae55357c0e3ffeca5a475ef5733.tar.gz
lwn-637fc7e479a60ae55357c0e3ffeca5a475ef5733.zip
page migration: fix NR_FILE_PAGES accounting
NR_FILE_PAGES must be accounted for depending on the zone that the page belongs to. If we replace the page in the radix tree then we may have to shift the count to another zone. Suggested-by: Ethan Solomita <solo@google.com> Cc: Martin Bligh <mbligh@mbligh.org> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--mm/migrate.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index e9b161bde95b..4372d6b313ab 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -297,7 +297,7 @@ static int migrate_page_move_mapping(struct address_space *mapping,
void **pslot;
if (!mapping) {
- /* Anonymous page */
+ /* Anonymous page without mapping */
if (page_count(page) != 1)
return -EAGAIN;
return 0;
@@ -333,6 +333,19 @@ static int migrate_page_move_mapping(struct address_space *mapping,
*/
__put_page(page);
+ /*
+ * If moved to a different zone then also account
+ * the page for that zone. Other VM counters will be
+ * taken care of when we establish references to the
+ * new page and drop references to the old page.
+ *
+ * Note that anonymous pages are accounted for
+ * via NR_FILE_PAGES and NR_ANON_PAGES if they
+ * are mapped to swap space.
+ */
+ __dec_zone_page_state(page, NR_FILE_PAGES);
+ __inc_zone_page_state(newpage, NR_FILE_PAGES);
+
write_unlock_irq(&mapping->tree_lock);
return 0;