summaryrefslogtreecommitdiffstats
path: root/mm/migrate.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/migrate.c')
-rw-r--r--mm/migrate.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 8992741f10aa..a42858d8e00b 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -767,12 +767,12 @@ recheck_buffers:
767 } 767 }
768 bh = bh->b_this_page; 768 bh = bh->b_this_page;
769 } while (bh != head); 769 } while (bh != head);
770 spin_unlock(&mapping->private_lock);
771 if (busy) { 770 if (busy) {
772 if (invalidated) { 771 if (invalidated) {
773 rc = -EAGAIN; 772 rc = -EAGAIN;
774 goto unlock_buffers; 773 goto unlock_buffers;
775 } 774 }
775 spin_unlock(&mapping->private_lock);
776 invalidate_bh_lrus(); 776 invalidate_bh_lrus();
777 invalidated = true; 777 invalidated = true;
778 goto recheck_buffers; 778 goto recheck_buffers;
@@ -805,6 +805,8 @@ recheck_buffers:
805 805
806 rc = MIGRATEPAGE_SUCCESS; 806 rc = MIGRATEPAGE_SUCCESS;
807unlock_buffers: 807unlock_buffers:
808 if (check_refs)
809 spin_unlock(&mapping->private_lock);
808 bh = head; 810 bh = head;
809 do { 811 do {
810 unlock_buffer(bh); 812 unlock_buffer(bh);
@@ -2338,16 +2340,13 @@ next:
2338static void migrate_vma_collect(struct migrate_vma *migrate) 2340static void migrate_vma_collect(struct migrate_vma *migrate)
2339{ 2341{
2340 struct mmu_notifier_range range; 2342 struct mmu_notifier_range range;
2341 struct mm_walk mm_walk; 2343 struct mm_walk mm_walk = {
2342 2344 .pmd_entry = migrate_vma_collect_pmd,
2343 mm_walk.pmd_entry = migrate_vma_collect_pmd; 2345 .pte_hole = migrate_vma_collect_hole,
2344 mm_walk.pte_entry = NULL; 2346 .vma = migrate->vma,
2345 mm_walk.pte_hole = migrate_vma_collect_hole; 2347 .mm = migrate->vma->vm_mm,
2346 mm_walk.hugetlb_entry = NULL; 2348 .private = migrate,
2347 mm_walk.test_walk = NULL; 2349 };
2348 mm_walk.vma = migrate->vma;
2349 mm_walk.mm = migrate->vma->vm_mm;
2350 mm_walk.private = migrate;
2351 2350
2352 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm, 2351 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm,
2353 migrate->start, 2352 migrate->start,