aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-04-23 17:41:09 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-04-24 11:23:08 -0400
commit0e8c7d0fd5b4999675c7d5cd95d0eb7106b756b3 (patch)
tree10b3236df34daab7420408ce88d80f09cfcdf99c
parent10ccaf4b7121fb839442be7e079baa8fd0b28caf (diff)
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> Eventually-typed-in-by: Christoph Lameter <clameter@sgi.com> Cc: Martin Bligh <mbligh@mbligh.org> Cc: <stable@kernel.org> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/migrate.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 7a66ca25dc8a..a91ca00abebe 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -297,7 +297,7 @@ static int migrate_page_move_mapping(struct address_space *mapping,
297 void **pslot; 297 void **pslot;
298 298
299 if (!mapping) { 299 if (!mapping) {
300 /* Anonymous page */ 300 /* Anonymous page without mapping */
301 if (page_count(page) != 1) 301 if (page_count(page) != 1)
302 return -EAGAIN; 302 return -EAGAIN;
303 return 0; 303 return 0;
@@ -333,6 +333,19 @@ static int migrate_page_move_mapping(struct address_space *mapping,
333 */ 333 */
334 __put_page(page); 334 __put_page(page);
335 335
336 /*
337 * If moved to a different zone then also account
338 * the page for that zone. Other VM counters will be
339 * taken care of when we establish references to the
340 * new page and drop references to the old page.
341 *
342 * Note that anonymous pages are accounted for
343 * via NR_FILE_PAGES and NR_ANON_PAGES if they
344 * are mapped to swap space.
345 */
346 __dec_zone_page_state(page, NR_FILE_PAGES);
347 __inc_zone_page_state(newpage, NR_FILE_PAGES);
348
336 write_unlock_irq(&mapping->tree_lock); 349 write_unlock_irq(&mapping->tree_lock);
337 350
338 return 0; 351 return 0;