On Tue, 26 May 2026 14:04:57 +0100 Kiryl Shutsemau <[email protected]> wrote:
> From: "Kiryl Shutsemau (Meta)" <[email protected]> > > Preparatory patch. Add the change_protection() primitive that > userfaultfd RWP will use. > > An RWP-protected PTE is PAGE_NONE with the uffd PTE bit set. The > PROT_NONE half makes the CPU fault on any access; the uffd bit > distinguishes an RWP fault from a plain mprotect(PROT_NONE) or NUMA > hinting fault. MM_CP_UFFD_WP and MM_CP_UFFD_RWP share the same PTE > bit, so the two cannot be used together on the same range. > > Two new change_protection() flags: > > MM_CP_UFFD_RWP install PAGE_NONE and set the uffd bit > MM_CP_UFFD_RWP_RESOLVE restore vma->vm_page_prot, clear the uffd bit > > Both are wired through change_pte_range(), change_huge_pmd(), and > hugetlb_change_protection() so anon, shmem, THP, and hugetlb all > share the same semantics. > > Signed-off-by: Kiryl Shutsemau <[email protected]> > Assisted-by: Claude:claude-opus-4-6 > Reviewed-by: Mike Rapoport (Microsoft) <[email protected]> Reviewed-by: SeongJae Park <[email protected]> > --- > include/linux/mm.h | 5 ++++ > include/linux/userfaultfd_k.h | 1 - > mm/huge_memory.c | 30 +++++++++++++---------- > mm/hugetlb.c | 25 ++++++++++++++----- > mm/mprotect.c | 46 +++++++++++++++++++++++++++-------- > 5 files changed, 77 insertions(+), 30 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 6499cfb61dc4..f79801816f32 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -3297,6 +3297,11 @@ int get_cmdline(struct task_struct *task, char > *buffer, int buflen); > #define MM_CP_UFFD_WP_RESOLVE (1UL << 3) /* Resolve wp */ > #define MM_CP_UFFD_WP_ALL (MM_CP_UFFD_WP | \ > MM_CP_UFFD_WP_RESOLVE) > +/* Whether this change is for uffd RWP */ > +#define MM_CP_UFFD_RWP (1UL << 4) /* do rwp */ > +#define MM_CP_UFFD_RWP_RESOLVE (1UL << 5) /* resolve rwp */ > +#define MM_CP_UFFD_RWP_ALL (MM_CP_UFFD_RWP | \ > + MM_CP_UFFD_RWP_RESOLVE) > > bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr, > pte_t pte); > diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h > index 0aef628514df..564eb2aac321 100644 > --- a/include/linux/userfaultfd_k.h > +++ b/include/linux/userfaultfd_k.h > @@ -361,7 +361,6 @@ static inline bool userfaultfd_huge_pmd_wp(struct > vm_area_struct *vma, > return false; > } > > - Nice cleanup. Thanks, SJ [...]

