diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 73ba4046ed27..5eecb514ccea 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -670,10 +670,10 @@ retry: | |||
670 | * list. The direct migration patchset | 670 | * list. The direct migration patchset |
671 | * extends this function to avoid the use of swap. | 671 | * extends this function to avoid the use of swap. |
672 | */ | 672 | */ |
673 | int migrate_pages(struct list_head *l, struct list_head *t) | 673 | int migrate_pages(struct list_head *from, struct list_head *to, |
674 | struct list_head *moved, struct list_head *failed) | ||
674 | { | 675 | { |
675 | int retry; | 676 | int retry; |
676 | LIST_HEAD(failed); | ||
677 | int nr_failed = 0; | 677 | int nr_failed = 0; |
678 | int pass = 0; | 678 | int pass = 0; |
679 | struct page *page; | 679 | struct page *page; |
@@ -686,12 +686,12 @@ int migrate_pages(struct list_head *l, struct list_head *t) | |||
686 | redo: | 686 | redo: |
687 | retry = 0; | 687 | retry = 0; |
688 | 688 | ||
689 | list_for_each_entry_safe(page, page2, l, lru) { | 689 | list_for_each_entry_safe(page, page2, from, lru) { |
690 | cond_resched(); | 690 | cond_resched(); |
691 | 691 | ||
692 | if (page_count(page) == 1) { | 692 | if (page_count(page) == 1) { |
693 | /* page was freed from under us. So we are done. */ | 693 | /* page was freed from under us. So we are done. */ |
694 | move_to_lru(page); | 694 | list_move(&page->lru, moved); |
695 | continue; | 695 | continue; |
696 | } | 696 | } |
697 | /* | 697 | /* |
@@ -722,7 +722,7 @@ redo: | |||
722 | if (PageAnon(page) && !PageSwapCache(page)) { | 722 | if (PageAnon(page) && !PageSwapCache(page)) { |
723 | if (!add_to_swap(page, GFP_KERNEL)) { | 723 | if (!add_to_swap(page, GFP_KERNEL)) { |
724 | unlock_page(page); | 724 | unlock_page(page); |
725 | list_move(&page->lru, &failed); | 725 | list_move(&page->lru, failed); |
726 | nr_failed++; | 726 | nr_failed++; |
727 | continue; | 727 | continue; |
728 | } | 728 | } |
@@ -732,8 +732,10 @@ redo: | |||
732 | * Page is properly locked and writeback is complete. | 732 | * Page is properly locked and writeback is complete. |
733 | * Try to migrate the page. | 733 | * Try to migrate the page. |
734 | */ | 734 | */ |
735 | if (!swap_page(page)) | 735 | if (!swap_page(page)) { |
736 | list_move(&page->lru, moved); | ||
736 | continue; | 737 | continue; |
738 | } | ||
737 | retry_later: | 739 | retry_later: |
738 | retry++; | 740 | retry++; |
739 | } | 741 | } |
@@ -743,9 +745,6 @@ retry_later: | |||
743 | if (!swapwrite) | 745 | if (!swapwrite) |
744 | current->flags &= ~PF_SWAPWRITE; | 746 | current->flags &= ~PF_SWAPWRITE; |
745 | 747 | ||
746 | if (!list_empty(&failed)) | ||
747 | list_splice(&failed, l); | ||
748 | |||
749 | return nr_failed + retry; | 748 | return nr_failed + retry; |
750 | } | 749 | } |
751 | 750 | ||