diff options
author | David Hildenbrand <david@redhat.com> | 2022-11-16 11:26:47 +0100 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2022-12-01 00:58:58 +0100 |
commit | 8d6a0ac09a16c026e1e2a03a61e12e95c48a25a6 (patch) | |
tree | 12a405b47fe320646f6335e902155bf51da1bd2c /mm/memory.c | |
parent | mm: don't call vm_ops->huge_fault() in wp_huge_pmd()/wp_huge_pud() for privat... (diff) | |
download | linux-8d6a0ac09a16c026e1e2a03a61e12e95c48a25a6.tar.xz linux-8d6a0ac09a16c026e1e2a03a61e12e95c48a25a6.zip |
mm: extend FAULT_FLAG_UNSHARE support to anything in a COW mapping
Extend FAULT_FLAG_UNSHARE to break COW on anything mapped into a
COW (i.e., private writable) mapping and adjust the documentation
accordingly.
FAULT_FLAG_UNSHARE will now also break COW when encountering the shared
zeropage, a pagecache page, a PFNMAP, ... inside a COW mapping, by
properly replacing the mapped page/pfn by a private copy (an exclusive
anonymous page).
Note that only do_wp_page() needs care: hugetlb_wp() already handles
FAULT_FLAG_UNSHARE correctly. wp_huge_pmd()/wp_huge_pud() also handles it
correctly, for example, splitting the huge zeropage on FAULT_FLAG_UNSHARE
such that we can handle FAULT_FLAG_UNSHARE on the PTE level.
This change is a requirement for reliable long-term R/O pinning in
COW mappings.
Link: https://lkml.kernel.org/r/20221116102659.70287-9-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 4 |
1 files changed, 0 insertions, 4 deletions
diff --git a/mm/memory.c b/mm/memory.c index 6cec0adab37f..815d2ff05c62 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3431,10 +3431,6 @@ reuse: } wp_page_reuse(vmf); return VM_FAULT_WRITE; - } else if (unshare) { - /* No anonymous page -> nothing to do. */ - pte_unmap_unlock(vmf->pte, vmf->ptl); - return 0; } copy: /* |