diff options
-rw-r--r-- | fs/hugetlbfs/inode.c | 4 | ||||
-rw-r--r-- | include/linux/migrate.h | 7 | ||||
-rw-r--r-- | mm/migrate.c | 33 |
3 files changed, 24 insertions, 20 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 47e6e2f21e21..4a55f35a6ced 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -582,11 +582,11 @@ static int hugetlbfs_migrate_page(struct address_space *mapping, | |||
582 | int rc; | 582 | int rc; |
583 | 583 | ||
584 | rc = migrate_huge_page_move_mapping(mapping, newpage, page); | 584 | rc = migrate_huge_page_move_mapping(mapping, newpage, page); |
585 | if (rc) | 585 | if (rc != MIGRATEPAGE_SUCCESS) |
586 | return rc; | 586 | return rc; |
587 | migrate_page_copy(newpage, page); | 587 | migrate_page_copy(newpage, page); |
588 | 588 | ||
589 | return 0; | 589 | return MIGRATEPAGE_SUCCESS; |
590 | } | 590 | } |
591 | 591 | ||
592 | static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 592 | static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index ce7e6671968b..a4e886d17f87 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
@@ -7,6 +7,13 @@ | |||
7 | 7 | ||
8 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); | 8 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); |
9 | 9 | ||
10 | /* | ||
11 | * Return values from addresss_space_operations.migratepage(): | ||
12 | * - negative errno on page migration failure; | ||
13 | * - zero on page migration success; | ||
14 | */ | ||
15 | #define MIGRATEPAGE_SUCCESS 0 | ||
16 | |||
10 | #ifdef CONFIG_MIGRATION | 17 | #ifdef CONFIG_MIGRATION |
11 | 18 | ||
12 | extern void putback_lru_pages(struct list_head *l); | 19 | extern void putback_lru_pages(struct list_head *l); |
diff --git a/mm/migrate.c b/mm/migrate.c index 1dc4598d2513..33f5f82a6006 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -276,7 +276,7 @@ static int migrate_page_move_mapping(struct address_space *mapping, | |||
276 | /* Anonymous page without mapping */ | 276 | /* Anonymous page without mapping */ |
277 | if (page_count(page) != 1) | 277 | if (page_count(page) != 1) |
278 | return -EAGAIN; | 278 | return -EAGAIN; |
279 | return 0; | 279 | return MIGRATEPAGE_SUCCESS; |
280 | } | 280 | } |
281 | 281 | ||
282 | spin_lock_irq(&mapping->tree_lock); | 282 | spin_lock_irq(&mapping->tree_lock); |
@@ -346,7 +346,7 @@ static int migrate_page_move_mapping(struct address_space *mapping, | |||
346 | } | 346 | } |
347 | spin_unlock_irq(&mapping->tree_lock); | 347 | spin_unlock_irq(&mapping->tree_lock); |
348 | 348 | ||
349 | return 0; | 349 | return MIGRATEPAGE_SUCCESS; |
350 | } | 350 | } |
351 | 351 | ||
352 | /* | 352 | /* |
@@ -362,7 +362,7 @@ int migrate_huge_page_move_mapping(struct address_space *mapping, | |||
362 | if (!mapping) { | 362 | if (!mapping) { |
363 | if (page_count(page) != 1) | 363 | if (page_count(page) != 1) |
364 | return -EAGAIN; | 364 | return -EAGAIN; |
365 | return 0; | 365 | return MIGRATEPAGE_SUCCESS; |
366 | } | 366 | } |
367 | 367 | ||
368 | spin_lock_irq(&mapping->tree_lock); | 368 | spin_lock_irq(&mapping->tree_lock); |
@@ -389,7 +389,7 @@ int migrate_huge_page_move_mapping(struct address_space *mapping, | |||
389 | page_unfreeze_refs(page, expected_count - 1); | 389 | page_unfreeze_refs(page, expected_count - 1); |
390 | 390 | ||
391 | spin_unlock_irq(&mapping->tree_lock); | 391 | spin_unlock_irq(&mapping->tree_lock); |
392 | return 0; | 392 | return MIGRATEPAGE_SUCCESS; |
393 | } | 393 | } |
394 | 394 | ||
395 | /* | 395 | /* |
@@ -476,11 +476,11 @@ int migrate_page(struct address_space *mapping, | |||
476 | 476 | ||
477 | rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode); | 477 | rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode); |
478 | 478 | ||
479 | if (rc) | 479 | if (rc != MIGRATEPAGE_SUCCESS) |
480 | return rc; | 480 | return rc; |
481 | 481 | ||
482 | migrate_page_copy(newpage, page); | 482 | migrate_page_copy(newpage, page); |
483 | return 0; | 483 | return MIGRATEPAGE_SUCCESS; |
484 | } | 484 | } |
485 | EXPORT_SYMBOL(migrate_page); | 485 | EXPORT_SYMBOL(migrate_page); |
486 | 486 | ||
@@ -503,7 +503,7 @@ int buffer_migrate_page(struct address_space *mapping, | |||
503 | 503 | ||
504 | rc = migrate_page_move_mapping(mapping, newpage, page, head, mode); | 504 | rc = migrate_page_move_mapping(mapping, newpage, page, head, mode); |
505 | 505 | ||
506 | if (rc) | 506 | if (rc != MIGRATEPAGE_SUCCESS) |
507 | return rc; | 507 | return rc; |
508 | 508 | ||
509 | /* | 509 | /* |
@@ -539,7 +539,7 @@ int buffer_migrate_page(struct address_space *mapping, | |||
539 | 539 | ||
540 | } while (bh != head); | 540 | } while (bh != head); |
541 | 541 | ||
542 | return 0; | 542 | return MIGRATEPAGE_SUCCESS; |
543 | } | 543 | } |
544 | EXPORT_SYMBOL(buffer_migrate_page); | 544 | EXPORT_SYMBOL(buffer_migrate_page); |
545 | #endif | 545 | #endif |
@@ -618,7 +618,7 @@ static int fallback_migrate_page(struct address_space *mapping, | |||
618 | * | 618 | * |
619 | * Return value: | 619 | * Return value: |
620 | * < 0 - error code | 620 | * < 0 - error code |
621 | * == 0 - success | 621 | * MIGRATEPAGE_SUCCESS - success |
622 | */ | 622 | */ |
623 | static int move_to_new_page(struct page *newpage, struct page *page, | 623 | static int move_to_new_page(struct page *newpage, struct page *page, |
624 | int remap_swapcache, enum migrate_mode mode) | 624 | int remap_swapcache, enum migrate_mode mode) |
@@ -655,7 +655,7 @@ static int move_to_new_page(struct page *newpage, struct page *page, | |||
655 | else | 655 | else |
656 | rc = fallback_migrate_page(mapping, newpage, page, mode); | 656 | rc = fallback_migrate_page(mapping, newpage, page, mode); |
657 | 657 | ||
658 | if (rc) { | 658 | if (rc != MIGRATEPAGE_SUCCESS) { |
659 | newpage->mapping = NULL; | 659 | newpage->mapping = NULL; |
660 | } else { | 660 | } else { |
661 | if (remap_swapcache) | 661 | if (remap_swapcache) |
@@ -804,7 +804,7 @@ skip_unmap: | |||
804 | put_anon_vma(anon_vma); | 804 | put_anon_vma(anon_vma); |
805 | 805 | ||
806 | uncharge: | 806 | uncharge: |
807 | mem_cgroup_end_migration(mem, page, newpage, rc == 0); | 807 | mem_cgroup_end_migration(mem, page, newpage, rc == MIGRATEPAGE_SUCCESS); |
808 | unlock: | 808 | unlock: |
809 | unlock_page(page); | 809 | unlock_page(page); |
810 | out: | 810 | out: |
@@ -977,7 +977,7 @@ int migrate_pages(struct list_head *from, | |||
977 | case -EAGAIN: | 977 | case -EAGAIN: |
978 | retry++; | 978 | retry++; |
979 | break; | 979 | break; |
980 | case 0: | 980 | case MIGRATEPAGE_SUCCESS: |
981 | break; | 981 | break; |
982 | default: | 982 | default: |
983 | /* Permanent failure */ | 983 | /* Permanent failure */ |
@@ -986,15 +986,12 @@ int migrate_pages(struct list_head *from, | |||
986 | } | 986 | } |
987 | } | 987 | } |
988 | } | 988 | } |
989 | rc = 0; | 989 | rc = nr_failed + retry; |
990 | out: | 990 | out: |
991 | if (!swapwrite) | 991 | if (!swapwrite) |
992 | current->flags &= ~PF_SWAPWRITE; | 992 | current->flags &= ~PF_SWAPWRITE; |
993 | 993 | ||
994 | if (rc) | 994 | return rc; |
995 | return rc; | ||
996 | |||
997 | return nr_failed + retry; | ||
998 | } | 995 | } |
999 | 996 | ||
1000 | int migrate_huge_page(struct page *hpage, new_page_t get_new_page, | 997 | int migrate_huge_page(struct page *hpage, new_page_t get_new_page, |
@@ -1014,7 +1011,7 @@ int migrate_huge_page(struct page *hpage, new_page_t get_new_page, | |||
1014 | /* try again */ | 1011 | /* try again */ |
1015 | cond_resched(); | 1012 | cond_resched(); |
1016 | break; | 1013 | break; |
1017 | case 0: | 1014 | case MIGRATEPAGE_SUCCESS: |
1018 | goto out; | 1015 | goto out; |
1019 | default: | 1016 | default: |
1020 | rc = -EIO; | 1017 | rc = -EIO; |