]> Pileus Git - ~andy/linux/blobdiff - mm/mremap.c
mm: simplify find_vma_prev()
[~andy/linux] / mm / mremap.c
index d6959cb4df58f1d694c179898553bf7e3150cc49..87bb8393e7d238115a450139d24c090347c215a7 100644 (file)
@@ -220,6 +220,15 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 
        moved_len = move_page_tables(vma, old_addr, new_vma, new_addr, old_len);
        if (moved_len < old_len) {
+               /*
+                * Before moving the page tables from the new vma to
+                * the old vma, we need to be sure the old vma is
+                * queued after new vma in the same_anon_vma list to
+                * prevent SMP races with rmap_walk (that could lead
+                * rmap_walk to miss some page table).
+                */
+               anon_vma_moveto_tail(vma);
+
                /*
                 * On error, move entries back from new area to old,
                 * which will succeed since page tables still there,