diff options
author | Jacobo Giralt <jacobo.giralt@gmail.com> | 2012-01-10 18:07:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 19:30:41 -0500 |
commit | 937a94c9db30a818baa5e2c09dbf4589251355c3 (patch) | |
tree | c038d9689edf1f03467227959f66c3ef750a9572 /mm | |
parent | 90a5d5af74f6570af063fb6bff33c6b2f8361bbc (diff) |
mm: migrate: one less atomic operation
migrate_page_move_mapping() drops a reference from the old page after
unfreezing its counter. Both operations can be merged into a single
atomic operation by directly unfreezing to one less reference.
The same applies to migrate_huge_page_move_mapping().
Signed-off-by: Jacobo Giralt <jacobo.giralt@gmail.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Johannes Weiner <jweiner@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/migrate.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 177aca424a0..594dc375d0f 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -269,12 +269,12 @@ static int migrate_page_move_mapping(struct address_space *mapping, | |||
269 | 269 | ||
270 | radix_tree_replace_slot(pslot, newpage); | 270 | radix_tree_replace_slot(pslot, newpage); |
271 | 271 | ||
272 | page_unfreeze_refs(page, expected_count); | ||
273 | /* | 272 | /* |
274 | * Drop cache reference from old page. | 273 | * Drop cache reference from old page by unfreezing |
274 | * to one less reference. | ||
275 | * We know this isn't the last reference. | 275 | * We know this isn't the last reference. |
276 | */ | 276 | */ |
277 | __put_page(page); | 277 | page_unfreeze_refs(page, expected_count - 1); |
278 | 278 | ||
279 | /* | 279 | /* |
280 | * If moved to a different zone then also account | 280 | * If moved to a different zone then also account |
@@ -334,9 +334,7 @@ int migrate_huge_page_move_mapping(struct address_space *mapping, | |||
334 | 334 | ||
335 | radix_tree_replace_slot(pslot, newpage); | 335 | radix_tree_replace_slot(pslot, newpage); |
336 | 336 | ||
337 | page_unfreeze_refs(page, expected_count); | 337 | page_unfreeze_refs(page, expected_count - 1); |
338 | |||
339 | __put_page(page); | ||
340 | 338 | ||
341 | spin_unlock_irq(&mapping->tree_lock); | 339 | spin_unlock_irq(&mapping->tree_lock); |
342 | return 0; | 340 | return 0; |