On Fri, May 29, 2026 at 08:24:55AM +0100, Lorenzo Stoakes wrote:
> On Tue, May 26, 2026 at 02:04:56PM +0100, Kiryl Shutsemau wrote:
> > From: "Kiryl Shutsemau (Meta)" <[email protected]>
> >
> > Preparatory patch for userfaultfd read-write protection (RWP). RWP
> > extends userfaultfd protection from plain write-protection (WP) to
> > full read-write protection: accesses to an RWP-protected range --
> > reads as well as writes -- trap through userfaultfd.
> >
> > Reserve VM_UFFD_RWP, add the userfaultfd_rwp() and
> > userfaultfd_protected() helpers, and wire up the smaps "ur" entry and
> > the trace-flag table the rest of the series will use. The flag is
> > gated on CONFIG_USERFAULTFD_RWP, which is introduced together with the
> > UAPI in a later patch; until then VM_UFFD_RWP aliases VM_NONE and
> > every downstream check folds to dead code.
> >
> > Nothing sets or queries the flag yet.
> >
> > Signed-off-by: Kiryl Shutsemau <[email protected]>
> > Assisted-by: Claude:claude-opus-4-6
> 
> Hm, if you've just used claude to bounce ideas off, I'm really not sure if
> it's necessary to disclose, though I respect your thoroughness for doing so
> :)

I've elaborated on how I used Claude in reply to Andrew:

https://lore.kernel.org/all/af5eALk9yO8pPcHv@thinkstation

It is more than bouncing ideas.

> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 71b11945e4fc..6499cfb61dc4 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -362,6 +362,7 @@ enum {
> >  #endif
> >     DECLARE_VMA_BIT(UFFD_MINOR, 41),
> >     DECLARE_VMA_BIT(SEALED, 42),
> > +   DECLARE_VMA_BIT(UFFD_RWP, 43),
> 
> I'm guessing CONFIG_USERFAULTFD_RWP is predicated on CONFIG_64BIT?

Yes:
        depends on 64BIT && ARCH_HAS_PTE_PROTNONE && HAVE_ARCH_USERFAULTFD_WP
> 
> It's a silly situation and once my VMA flags stuff is done it'll be
> eliminated but for now... :)

Yeah. I actually would appreciate your take on 04/18. It is related.

> > diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h
> > index f4cf5763f92c..0aef628514df 100644
> > --- a/include/linux/userfaultfd_k.h
> > +++ b/include/linux/userfaultfd_k.h
> > @@ -21,10 +21,11 @@
> >  #include <linux/hugetlb_inline.h>
> >
> >  /* The set of all possible UFFD-related VM flags. */
> > -#define __VM_UFFD_FLAGS (VM_UFFD_MISSING | VM_UFFD_WP | VM_UFFD_MINOR)
> > +#define __VM_UFFD_FLAGS (VM_UFFD_MISSING | VM_UFFD_MINOR | \
> > +                    VM_UFFD_WP | VM_UFFD_RWP)
> >
> >  #define __VMA_UFFD_FLAGS mk_vma_flags(VMA_UFFD_MISSING_BIT, 
> > VMA_UFFD_WP_BIT, \
> > -                                 VMA_UFFD_MINOR_BIT)
> > +                                 VMA_UFFD_MINOR_BIT, VMA_UFFD_RWP_BIT)
> >
> >  /*
> >   * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
> > @@ -178,7 +179,7 @@ static inline bool 
> > is_mergeable_vm_userfaultfd_ctx(struct vm_area_struct *vma,
> >   */
> >  static inline bool uffd_disable_huge_pmd_share(struct vm_area_struct *vma)
> >  {
> > -   return vma->vm_flags & (VM_UFFD_WP | VM_UFFD_MINOR);
> > +   return vma->vm_flags & (VM_UFFD_MINOR | VM_UFFD_WP | VM_UFFD_RWP);
> 
> While we're here we might as well switch to using the new API?
> 
> Can do:
> 
>       return vma_test_any_mask(vma, __VMA_UFFD_FLAGS);
> 
> One unfortunate thing is using bit values means we can't do the VM_NONE
> trick, but if !CONFIG_USERFAULTFD_RWP then VMA_UFFD_RWP_BIT wouldn't be set
> anyway, same for minor so this should be fine?

I think we need to decide first if the 04/18 direction is right.
We can define VMA_UFFD_RWP_BIT to VMA_NO_BIT if !CONFIG_USERFAULTFD_RWP.

> >  }
> >
> >  /*
> > @@ -208,6 +209,16 @@ static inline bool userfaultfd_minor(struct 
> > vm_area_struct *vma)
> >     return vma->vm_flags & VM_UFFD_MINOR;
> >  }
> >
> > +static inline bool userfaultfd_rwp(struct vm_area_struct *vma)
> > +{
> > +   return vma->vm_flags & VM_UFFD_RWP;
> > +}
> 
> Can be:
> 
>       return vma_test(vma, VMA_UFFD_RWP_BIT);

Yep.


-- 
  Kiryl Shutsemau / Kirill A. Shutemov

Reply via email to