diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f969da5dd8a2..81a127643aea 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -924,15 +924,21 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest, | |||
924 | nodemask_t nmask; | 924 | nodemask_t nmask; |
925 | LIST_HEAD(pagelist); | 925 | LIST_HEAD(pagelist); |
926 | int err = 0; | 926 | int err = 0; |
927 | struct vm_area_struct *vma; | ||
927 | 928 | ||
928 | nodes_clear(nmask); | 929 | nodes_clear(nmask); |
929 | node_set(source, nmask); | 930 | node_set(source, nmask); |
930 | 931 | ||
931 | check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, | 932 | vma = check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, |
932 | flags | MPOL_MF_DISCONTIG_OK, &pagelist); | 933 | flags | MPOL_MF_DISCONTIG_OK, &pagelist); |
934 | if (IS_ERR(vma)) | ||
935 | return PTR_ERR(vma); | ||
933 | 936 | ||
934 | if (!list_empty(&pagelist)) | 937 | if (!list_empty(&pagelist)) { |
935 | err = migrate_pages(&pagelist, new_node_page, dest, 0); | 938 | err = migrate_pages(&pagelist, new_node_page, dest, 0); |
939 | if (err) | ||
940 | putback_lru_pages(&pagelist); | ||
941 | } | ||
936 | 942 | ||
937 | return err; | 943 | return err; |
938 | } | 944 | } |
@@ -1147,9 +1153,12 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
1147 | 1153 | ||
1148 | err = mbind_range(mm, start, end, new); | 1154 | err = mbind_range(mm, start, end, new); |
1149 | 1155 | ||
1150 | if (!list_empty(&pagelist)) | 1156 | if (!list_empty(&pagelist)) { |
1151 | nr_failed = migrate_pages(&pagelist, new_vma_page, | 1157 | nr_failed = migrate_pages(&pagelist, new_vma_page, |
1152 | (unsigned long)vma, 0); | 1158 | (unsigned long)vma, 0); |
1159 | if (nr_failed) | ||
1160 | putback_lru_pages(&pagelist); | ||
1161 | } | ||
1153 | 1162 | ||
1154 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) | 1163 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) |
1155 | err = -EIO; | 1164 | err = -EIO; |