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); |
