diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f969da5dd8a2..21243b2b7b07 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -931,8 +931,11 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest, | |||
931 | check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, | 931 | check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, |
932 | flags | MPOL_MF_DISCONTIG_OK, &pagelist); | 932 | flags | MPOL_MF_DISCONTIG_OK, &pagelist); |
933 | 933 | ||
934 | if (!list_empty(&pagelist)) | 934 | if (!list_empty(&pagelist)) { |
935 | err = migrate_pages(&pagelist, new_node_page, dest, 0); | 935 | err = migrate_pages(&pagelist, new_node_page, dest, 0); |
936 | if (err) | ||
937 | putback_lru_pages(&pagelist); | ||
938 | } | ||
936 | 939 | ||
937 | return err; | 940 | return err; |
938 | } | 941 | } |
@@ -1147,9 +1150,12 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
1147 | 1150 | ||
1148 | err = mbind_range(mm, start, end, new); | 1151 | err = mbind_range(mm, start, end, new); |
1149 | 1152 | ||
1150 | if (!list_empty(&pagelist)) | 1153 | if (!list_empty(&pagelist)) { |
1151 | nr_failed = migrate_pages(&pagelist, new_vma_page, | 1154 | nr_failed = migrate_pages(&pagelist, new_vma_page, |
1152 | (unsigned long)vma, 0); | 1155 | (unsigned long)vma, 0); |
1156 | if (nr_failed) | ||
1157 | putback_lru_pages(&pagelist); | ||
1158 | } | ||
1153 | 1159 | ||
1154 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) | 1160 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) |
1155 | err = -EIO; | 1161 | err = -EIO; |