diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 763794144697..a73504ff5ab9 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -593,9 +593,10 @@ static int move_to_new_page(struct page *newpage, struct page *page) | |||
593 | else | 593 | else |
594 | rc = fallback_migrate_page(mapping, newpage, page); | 594 | rc = fallback_migrate_page(mapping, newpage, page); |
595 | 595 | ||
596 | if (!rc) | 596 | if (!rc) { |
597 | mem_cgroup_page_migration(page, newpage); | ||
597 | remove_migration_ptes(page, newpage); | 598 | remove_migration_ptes(page, newpage); |
598 | else | 599 | } else |
599 | newpage->mapping = NULL; | 600 | newpage->mapping = NULL; |
600 | 601 | ||
601 | unlock_page(newpage); | 602 | unlock_page(newpage); |
@@ -614,6 +615,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
614 | int *result = NULL; | 615 | int *result = NULL; |
615 | struct page *newpage = get_new_page(page, private, &result); | 616 | struct page *newpage = get_new_page(page, private, &result); |
616 | int rcu_locked = 0; | 617 | int rcu_locked = 0; |
618 | int charge = 0; | ||
617 | 619 | ||
618 | if (!newpage) | 620 | if (!newpage) |
619 | return -ENOMEM; | 621 | return -ENOMEM; |
@@ -673,14 +675,19 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
673 | goto rcu_unlock; | 675 | goto rcu_unlock; |
674 | } | 676 | } |
675 | 677 | ||
678 | charge = mem_cgroup_prepare_migration(page); | ||
676 | /* Establish migration ptes or remove ptes */ | 679 | /* Establish migration ptes or remove ptes */ |
677 | try_to_unmap(page, 1); | 680 | try_to_unmap(page, 1); |
678 | 681 | ||
679 | if (!page_mapped(page)) | 682 | if (!page_mapped(page)) |
680 | rc = move_to_new_page(newpage, page); | 683 | rc = move_to_new_page(newpage, page); |
681 | 684 | ||
682 | if (rc) | 685 | if (rc) { |
683 | remove_migration_ptes(page, page); | 686 | remove_migration_ptes(page, page); |
687 | if (charge) | ||
688 | mem_cgroup_end_migration(page); | ||
689 | } else if (charge) | ||
690 | mem_cgroup_end_migration(newpage); | ||
684 | rcu_unlock: | 691 | rcu_unlock: |
685 | if (rcu_locked) | 692 | if (rcu_locked) |
686 | rcu_read_unlock(); | 693 | rcu_read_unlock(); |