diff --git a/mm/memory.c b/mm/memory.c index 4bb3acfc3dd9c885956ec02bac7545b5f5e9947f..ead7b4eb2e40460a94a5f33b4fa03cf44e511747 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4922,6 +4922,11 @@ vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) if (!thp_vma_suitable_order(vma, haddr, PMD_ORDER)) return ret; + /* We're about to trigger CoW, so never map it through a PMD. */ + if (is_cow_mapping(vma->vm_flags) && + (vmf->flags & (FAULT_FLAG_WRITE|FAULT_FLAG_UNSHARE))) + return ret; + if (folio_order(folio) != HPAGE_PMD_ORDER) return ret; page = &folio->page;