Re: [PATCH v2 2/6] UFFDIO_RWPROTECT.2const: New page

Alejandro Colomar <[email protected]> Thu, 28 May 2026 13:35:06 +0200
Newsgroups org.kernel.vger.linux-man,org.kvack.linux-mm
Message-ID <ahgoSq87Hbk5e0J8@devuan>
Hi Kiryl,

On 2026-05-26T14:41:45+0100, Kiryl Shutsemau wrote:
> Document the UFFDIO_RWPROTECT ioctl (since Linux 7.2). It installs or
> removes read-write protection on a range that was registered with
> UFFDIO_REGISTER_MODE_RWP, and is also how a handler resolves an
> UFFD_PAGEFAULT_FLAG_RWP notification.
> 
> Cover the two mode bits (UFFDIO_RWPROTECT_MODE_RWP and
> UFFDIO_RWPROTECT_MODE_DONTWAKE, mutually exclusive), the populated-
> pages-only semantics, the anon vs file-backed reclaim behaviour, the
> explicit-drop list (MADV_DONTNEED, hole-punch, truncation), and the
> EINVAL/EAGAIN/ENOENT/EFAULT errors returned by the kernel.
> 
> Signed-off-by: Kiryl Shutsemau <[email protected]>
> Acked-by: Mike Rapoport (Microsoft) <[email protected]>

Thanks!  I've applied the patch (with a few minor tweaks).


Have a lovely day!
Alex

> ---
>  man/man2const/UFFDIO_RWPROTECT.2const | 122 ++++++++++++++++++++++++++
>  1 file changed, 122 insertions(+)
>  create mode 100644 man/man2const/UFFDIO_RWPROTECT.2const
> 
> diff --git a/man/man2const/UFFDIO_RWPROTECT.2const b/man/man2const/UFFDIO_RWPROTECT.2const
> new file mode 100644
> index 000000000000..42654a834cd5
> --- /dev/null
> +++ b/man/man2const/UFFDIO_RWPROTECT.2const
> @@ -0,0 +1,122 @@
> +.\" Copyright, the authors of the Linux man-pages project
> +.\"
> +.\" SPDX-License-Identifier: Linux-man-pages-copyleft
> +.\"
> +.TH UFFDIO_RWPROTECT 2const (date) "Linux man-pages (unreleased)"
> +.SH NAME
> +UFFDIO_RWPROTECT
> +\-
> +read-write-protect or un-protect a userfaultfd-registered memory range
> +.SH LIBRARY
> +Standard C library
> +.RI ( libc ,\~ \-lc )
> +.SH SYNOPSIS
> +.nf
> +.BR "#include <linux/userfaultfd.h>" "  /* Definition of " UFFD* " constants */"
> +.B #include <sys/ioctl.h>
> +.P
> +.BI "int ioctl(int " fd ", UFFDIO_RWPROTECT, struct uffdio_rwprotect *" argp );
> +.P
> +.B #include <linux/userfaultfd.h>
> +.P
> +.fi
> +.EX
> +.B struct uffdio_rwprotect {
> +.BR "    struct uffdio_range  range;" "  /* Range to change RWP on */"
> +.BR "    __u64                mode;" "   /* Mode flags */"
> +.B };
> +.EE
> +.SH DESCRIPTION
> +Read-write-protect or un-protect a userfaultfd-registered memory range
> +registered with mode
> +.BR UFFDIO_REGISTER_MODE_RWP .
> +.P
> +The following mode bits are supported:
> +.TP
> +.B UFFDIO_RWPROTECT_MODE_RWP
> +When this mode bit is set,
> +the ioctl installs read-write protection
> +on every page present in the range specified by
> +.IR range .
> +Otherwise the ioctl removes read-write protection from the range,
> +which is also how a fault handler resolves an
> +.B UFFD_PAGEFAULT_FLAG_RWP
> +notification.
> +.TP
> +.B UFFDIO_RWPROTECT_MODE_DONTWAKE
> +When this mode bit is set,
> +do not wake up any thread
> +that waits for page-fault resolution after the operation.
> +This can be specified only if
> +.B UFFDIO_RWPROTECT_MODE_RWP
> +is not specified.
> +.P
> +Read-write protection only affects pages
> +that are currently populated in the range;
> +unmapped addresses are left untouched.
> +For anonymous mappings,
> +protection is preserved across page reclaim
> +(the marker rides on the swap entry)
> +and migration.
> +For shmem and file-backed mappings,
> +protection is dropped when the backing page is reclaimed.
> +Callers must also re-arm a range with
> +.B UFFDIO_RWPROTECT
> +after any operation that explicitly drops the underlying page:
> +.B MADV_DONTNEED
> +on anonymous memory,
> +hole-punch on shmem,
> +truncation of a file mapping.
> +.SH RETURN VALUE
> +On success,
> +0 is returned.
> +On error, \-1 is returned and
> +.I errno
> +is set to indicate the error.
> +.SH ERRORS
> +.TP
> +.B EINVAL
> +The
> +.I start
> +or the
> +.I len
> +field of the
> +.I uffdio_range
> +structure was not a multiple of the system page size;
> +or
> +.I len
> +was zero;
> +or the specified range was otherwise invalid;
> +or an invalid mode bit was specified;
> +or
> +.B UFFDIO_RWPROTECT_MODE_DONTWAKE
> +was specified together with
> +.BR UFFDIO_RWPROTECT_MODE_RWP .
> +.TP
> +.B EAGAIN
> +The process was interrupted;
> +retry this call.
> +.TP
> +.B ENOENT
> +The range specified in
> +.I range
> +is not valid.
> +For example, the virtual address does not exist,
> +or part of the range is not registered with
> +.BR UFFDIO_REGISTER_MODE_RWP .
> +.TP
> +.B EFAULT
> +Encountered a generic fault during processing.
> +.SH STANDARDS
> +Linux.
> +.SH HISTORY
> +Linux 7.2.
> +.SH EXAMPLES
> +See
> +.BR userfaultfd (2).
> +.SH SEE ALSO
> +.BR ioctl (2),
> +.BR ioctl_userfaultfd (2),
> +.BR userfaultfd (2)
> +.P
> +.I linux.git/\:Documentation/\:admin\-guide/\:mm/\:userfaultfd.rst
> -- 
> 2.54.0
> 

-- 
<https://www.alejandro-colomar.es>
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEES7Jt9u9GbmlWADAi64mZXMKQwqkFAmoYKGkACgkQ64mZXMKQ
wqk+2BAAl3LZrDJYQbpJXu9NCgWxCQB1upmmlNwbVz1ZRo63QMxR26snfRM98hUH
elXYppn3Oe7wmLuwzPu6EAhJCc/DBXRictit79NTRfOgIiXwPy7dfndI2Sfoqk4o
zDwJ6WjQCz8pqIIjKodcHK04x0chYnnz24+tu6bmTTKMWEVnDPgb57QuB/o5yoaV
p2UhGpBddPKWrDcbhqZTzx0v6KjcjT30kdv2y5W/O2U3ruNh/90M2z5xHS9L/y92
ahcR4DBtEEKDW1VNSGO3oSELJmFRL7uX9b/jLCFxroG5DDHhdUASbHQfmBlxpw4+
Ywn0t/lm7ArQF7yWFJ7hBzkpWMBfTFr+/u5G9WW4gexd6gySl7YKefyzIsdT3H6x
QZsaiETkxlC3qYz8wM2+YjnquKef4DRaM3m0KCLqnSjbCPJaazMLnZjK24wTZj4K
oh6s578mPayPFMYsWNlUSjh9NQvGxHJQPUNqMLALgm1B+E5y4OjaMgGeImrZtfaf
qRf1VGDW5TRFOxiiZJ18w3ND5hn5bY11Rog8SFF5UbKasqPvg72fUm9N7AsYhO1L
YQ+pqHO0c68QInJZC+m6yBRPS4L6e7lxAkJJ+rwfCkf4KnRHRp3l/gduyMHGN2ym
FGRzMUXIDud753oPo2STb3qyPXit4dv3KuqLB+OGM58iEB1MVyY=
=DZ0D
-----END PGP SIGNATURE-----