aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/mempolicy.c6
-rw-r--r--mm/migrate.c20
2 files changed, 25 insertions, 1 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index ec4a1a950df9..73e0f23b7f51 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -632,6 +632,10 @@ int do_migrate_pages(struct mm_struct *mm,
632 632
633 down_read(&mm->mmap_sem); 633 down_read(&mm->mmap_sem);
634 634
635 err = migrate_vmas(mm, from_nodes, to_nodes, flags);
636 if (err)
637 goto out;
638
635/* 639/*
636 * Find a 'source' bit set in 'tmp' whose corresponding 'dest' 640 * Find a 'source' bit set in 'tmp' whose corresponding 'dest'
637 * bit in 'to' is not also set in 'tmp'. Clear the found 'source' 641 * bit in 'to' is not also set in 'tmp'. Clear the found 'source'
@@ -691,7 +695,7 @@ int do_migrate_pages(struct mm_struct *mm,
691 if (err < 0) 695 if (err < 0)
692 break; 696 break;
693 } 697 }
694 698out:
695 up_read(&mm->mmap_sem); 699 up_read(&mm->mmap_sem);
696 if (err < 0) 700 if (err < 0)
697 return err; 701 return err;
diff --git a/mm/migrate.c b/mm/migrate.c
index 1c2a71aa05cd..0576c0535988 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -976,3 +976,23 @@ out2:
976} 976}
977#endif 977#endif
978 978
979/*
980 * Call migration functions in the vma_ops that may prepare
981 * memory in a vm for migration. migration functions may perform
982 * the migration for vmas that do not have an underlying page struct.
983 */
984int migrate_vmas(struct mm_struct *mm, const nodemask_t *to,
985 const nodemask_t *from, unsigned long flags)
986{
987 struct vm_area_struct *vma;
988 int err = 0;
989
990 for(vma = mm->mmap; vma->vm_next && !err; vma = vma->vm_next) {
991 if (vma->vm_ops && vma->vm_ops->migrate) {
992 err = vma->vm_ops->migrate(vma, to, from, flags);
993 if (err)
994 break;
995 }
996 }
997 return err;
998}