--- x/mm/mremap.c +++ y/mm/mremap.c @@ -837,7 +837,6 @@ unsigned long move_page_tables(struct pa new_pmd = alloc_new_pmd(mm, pmc->new_addr); if (!new_pmd) break; -again: if (is_swap_pmd(*old_pmd) || pmd_trans_huge(*old_pmd)) { if (extent == HPAGE_PMD_SIZE && move_pgt_entry(pmc, HPAGE_PMD, old_pmd, new_pmd)) @@ -856,8 +855,9 @@ again: continue; if (pte_alloc(pmc->new->vm_mm, new_pmd)) break; + /* bail out to avoid clearing new_pmd */ if (move_ptes(pmc, extent, old_pmd, new_pmd) < 0) - goto again; + break; } mmu_notifier_invalidate_range_end(&range);