|
@@ -194,10 +194,17 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
|
|
|
break;
|
|
|
if (pmd_trans_huge(*old_pmd)) {
|
|
|
int err = 0;
|
|
|
- if (extent == HPAGE_PMD_SIZE)
|
|
|
+ if (extent == HPAGE_PMD_SIZE) {
|
|
|
+ VM_BUG_ON(vma->vm_file || !vma->anon_vma);
|
|
|
+ /* See comment in move_ptes() */
|
|
|
+ if (need_rmap_locks)
|
|
|
+ anon_vma_lock_write(vma->anon_vma);
|
|
|
err = move_huge_pmd(vma, new_vma, old_addr,
|
|
|
new_addr, old_end,
|
|
|
old_pmd, new_pmd);
|
|
|
+ if (need_rmap_locks)
|
|
|
+ anon_vma_unlock_write(vma->anon_vma);
|
|
|
+ }
|
|
|
if (err > 0) {
|
|
|
need_flush = true;
|
|
|
continue;
|