diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index f8c9bccf2520..fe5a3c6a5426 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -497,7 +497,6 @@ static int writeout(struct address_space *mapping, struct page *page) | |||
497 | .nr_to_write = 1, | 497 | .nr_to_write = 1, |
498 | .range_start = 0, | 498 | .range_start = 0, |
499 | .range_end = LLONG_MAX, | 499 | .range_end = LLONG_MAX, |
500 | .nonblocking = 1, | ||
501 | .for_reclaim = 1 | 500 | .for_reclaim = 1 |
502 | }; | 501 | }; |
503 | int rc; | 502 | int rc; |
@@ -884,8 +883,9 @@ out: | |||
884 | * | 883 | * |
885 | * The function returns after 10 attempts or if no pages | 884 | * The function returns after 10 attempts or if no pages |
886 | * are movable anymore because to has become empty | 885 | * are movable anymore because to has become empty |
887 | * or no retryable pages exist anymore. All pages will be | 886 | * or no retryable pages exist anymore. |
888 | * returned to the LRU or freed. | 887 | * Caller should call putback_lru_pages to return pages to the LRU |
888 | * or free list. | ||
889 | * | 889 | * |
890 | * Return: Number of pages not migrated or error code. | 890 | * Return: Number of pages not migrated or error code. |
891 | */ | 891 | */ |
@@ -932,8 +932,6 @@ out: | |||
932 | if (!swapwrite) | 932 | if (!swapwrite) |
933 | current->flags &= ~PF_SWAPWRITE; | 933 | current->flags &= ~PF_SWAPWRITE; |
934 | 934 | ||
935 | putback_lru_pages(from); | ||
936 | |||
937 | if (rc) | 935 | if (rc) |
938 | return rc; | 936 | return rc; |
939 | 937 | ||
@@ -1039,7 +1037,7 @@ static int do_move_page_to_node_array(struct mm_struct *mm, | |||
1039 | 1037 | ||
1040 | err = -EFAULT; | 1038 | err = -EFAULT; |
1041 | vma = find_vma(mm, pp->addr); | 1039 | vma = find_vma(mm, pp->addr); |
1042 | if (!vma || !vma_migratable(vma)) | 1040 | if (!vma || pp->addr < vma->vm_start || !vma_migratable(vma)) |
1043 | goto set_status; | 1041 | goto set_status; |
1044 | 1042 | ||
1045 | page = follow_page(vma, pp->addr, FOLL_GET); | 1043 | page = follow_page(vma, pp->addr, FOLL_GET); |
@@ -1088,9 +1086,12 @@ set_status: | |||
1088 | } | 1086 | } |
1089 | 1087 | ||
1090 | err = 0; | 1088 | err = 0; |
1091 | if (!list_empty(&pagelist)) | 1089 | if (!list_empty(&pagelist)) { |
1092 | err = migrate_pages(&pagelist, new_page_node, | 1090 | err = migrate_pages(&pagelist, new_page_node, |
1093 | (unsigned long)pm, 0); | 1091 | (unsigned long)pm, 0); |
1092 | if (err) | ||
1093 | putback_lru_pages(&pagelist); | ||
1094 | } | ||
1094 | 1095 | ||
1095 | up_read(&mm->mmap_sem); | 1096 | up_read(&mm->mmap_sem); |
1096 | return err; | 1097 | return err; |
@@ -1203,7 +1204,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages, | |||
1203 | int err = -EFAULT; | 1204 | int err = -EFAULT; |
1204 | 1205 | ||
1205 | vma = find_vma(mm, addr); | 1206 | vma = find_vma(mm, addr); |
1206 | if (!vma) | 1207 | if (!vma || addr < vma->vm_start) |
1207 | goto set_status; | 1208 | goto set_status; |
1208 | 1209 | ||
1209 | page = follow_page(vma, addr, 0); | 1210 | page = follow_page(vma, addr, 0); |