mremap.2: Document MREMAP_DONTUNMAP

Signed-off-by: Brian Geffon <bgeffon@google.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Brian Geffon 2020-04-15 09:49:49 -07:00 committed by Michael Kerrisk
parent cb76d6e5fe
commit 8debc4f595
1 changed files with 49 additions and 0 deletions

View File

@ -130,6 +130,22 @@ If
is specified, then
.B MREMAP_MAYMOVE
must also be specified.
.TP
.BR MREMAP_DONTUNMAP " (since Linux 5.7)"
.\" commit e346b3813067d4b17383f975f197a9aa28a3b077
This flag which must be used in conjunction with
.B MREMAP_MAYMOVE
remaps a mapping to a new address and it does not unmap the mapping at
.BR old_address .
This flag can only be used with private anonymous mappings.
Any access to the range specified at
.BR old_address
after completion will result in an anonymous page fault.
The anonymous page fault will be handled by a
.BR userfaultfd (2)
if the range was previously registered on the mapping specified by
.BR old_address .
Otherwise, it will be zero filled by the kernel.
.PP
If the memory segment specified by
.I old_address
@ -177,6 +193,8 @@ a value other than
.B MREMAP_MAYMOVE
or
.B MREMAP_FIXED
or
.B MREMAP_DONTUNMAP
was specified in
.IR flags ;
.IP *
@ -198,9 +216,22 @@ and
.IR old_size ;
.IP *
.B MREMAP_FIXED
or
.B MREMAP_DONTUNMAP
was specified without also specifying
.BR MREMAP_MAYMOVE ;
.IP *
.B MREMAP_DONTUNMAP
was specified with and
.BR old_address
that was not private anonymous;
.IP *
.B MREMAP_DONTUNMAP
was specified and
.BR old_size
was not equal to
.BR new_size ;
.IP *
\fIold_size\fP was zero and \fIold_address\fP does not refer to a
shareable mapping (but see BUGS);
.IP *
@ -210,10 +241,20 @@ flag was not specified.
.RE
.TP
.B ENOMEM
Not enough memory was available to complete the operation.
Possible causes are:
.RS
.IP * 3
The memory area cannot be expanded at the current virtual address, and the
.B MREMAP_MAYMOVE
flag is not set in \fIflags\fP.
Or, there is not enough (virtual) memory available.
.IP *
.B MREMAP_DONTUNMAP
was used causing a new mapping to be created that would exceed the
(virtual) memory available.
Or, it would exceed the maximum number of allowed mappings.
.RE
.SH CONFORMING TO
This call is Linux-specific, and should not be used in programs
intended to be portable.
@ -239,6 +280,14 @@ call will make a best effort to populate the new area but will not fail
with
.B ENOMEM
if the area cannot be populated.
.PP
The
.BR MREMAP_DONTUNMAP
flag may be used to atomically move a mapping while leaving the source
mapped.
Possible applications for this behavior might be garbage collection or
non-cooperative
.BR userfaultfd (2) .
.SH BUGS
Before Linux 4.14,
if