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