diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f969da5dd8a2..4a57f135b76e 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; |
@@ -1588,7 +1597,7 @@ unsigned slab_node(struct mempolicy *policy) | |||
1588 | (void)first_zones_zonelist(zonelist, highest_zoneidx, | 1597 | (void)first_zones_zonelist(zonelist, highest_zoneidx, |
1589 | &policy->v.nodes, | 1598 | &policy->v.nodes, |
1590 | &zone); | 1599 | &zone); |
1591 | return zone->node; | 1600 | return zone ? zone->node : numa_node_id(); |
1592 | } | 1601 | } |
1593 | 1602 | ||
1594 | default: | 1603 | default: |