There is pre-existing logic that appears to be undocumented for an mremap()
shrink operation, where it turns out that the usual 'input range must span
a single mapping' requirement no longer applies.
In fact, it turns out that the input range specified by [old_address,
old_address + old_size) may span any number of mappings.
If shrinking in-place (that is, neither the MREMAP_FIXED nor
MREMAP_DONTUNMAP flags are specified), then the new span may also span any
number of VMAs - [old_address, old_address + new_size).
If shrinking and moving, the range specified by [old_address, old_address +
new_size) must span a single VMA.
There must be at least one VMA contained within the [old_address,
old_address + old_size) range, and old_address must be within the range of
a VMA.
Explicitly document this.
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
---
man/man2/mremap.2 | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/man/man2/mremap.2 b/man/man2/mremap.2
index 6ba51310c..631c835b8 100644
--- a/man/man2/mremap.2
+++ b/man/man2/mremap.2
@@ -48,8 +48,35 @@ The
.B MREMAP_DONTUNMAP
flag may be specified.
.P
-If the operation is not
-simply moving mappings,
+Equally, if the operation performs a shrink,
+that is if
+.I old_size
+is greater than
+.IR new_size ,
+then
+.I old_size
+may also span multiple mappings
+which do not have to be
+adjacent to one another.
+If this shrink is performed
+in-place,
+that is,
+neither
+.BR MREMAP_FIXED ,
+nor
+.B MREMAP_DONTUNMAP
+are specified,
+.I new_size
+may also span multiple VMAs.
+However, if the range is moved,
+then
+.I new_size
+must span only a single mapping.
+.P
+If the operation is neither a
+.B MREMAP_FIXED
+move
+nor a shrink,
then
.I old_size
must span only a single mapping.
--
2.50.1
Hi Lorenzo, On Tue, Aug 05, 2025 at 06:31:56PM +0100, Lorenzo Stoakes wrote: > There is pre-existing logic that appears to be undocumented for an mremap() > shrink operation, where it turns out that the usual 'input range must span > a single mapping' requirement no longer applies. > > In fact, it turns out that the input range specified by [old_address, > old_address + old_size) may span any number of mappings. > > If shrinking in-place (that is, neither the MREMAP_FIXED nor > MREMAP_DONTUNMAP flags are specified), then the new span may also span any > number of VMAs - [old_address, old_address + new_size). > > If shrinking and moving, the range specified by [old_address, old_address + > new_size) must span a single VMA. > > There must be at least one VMA contained within the [old_address, > old_address + old_size) range, and old_address must be within the range of > a VMA. > > Explicitly document this. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Since this is documenting old behavior, could we have this patch before the patch documenting new behavior? Or do you prefer it in this order? Cheers, Alex > --- > man/man2/mremap.2 | 31 +++++++++++++++++++++++++++++-- > 1 file changed, 29 insertions(+), 2 deletions(-) > > diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 > index 6ba51310c..631c835b8 100644 > --- a/man/man2/mremap.2 > +++ b/man/man2/mremap.2 > @@ -48,8 +48,35 @@ The > .B MREMAP_DONTUNMAP > flag may be specified. > .P > -If the operation is not > -simply moving mappings, > +Equally, if the operation performs a shrink, > +that is if > +.I old_size > +is greater than > +.IR new_size , > +then > +.I old_size > +may also span multiple mappings > +which do not have to be > +adjacent to one another. > +If this shrink is performed > +in-place, > +that is, > +neither > +.BR MREMAP_FIXED , > +nor > +.B MREMAP_DONTUNMAP > +are specified, > +.I new_size > +may also span multiple VMAs. > +However, if the range is moved, > +then > +.I new_size > +must span only a single mapping. > +.P > +If the operation is neither a > +.B MREMAP_FIXED > +move > +nor a shrink, > then > .I old_size > must span only a single mapping. > -- > 2.50.1 > -- <https://www.alejandro-colomar.es/>
On Sat, Aug 09, 2025 at 04:33:12PM +0200, Alejandro Colomar wrote: > Hi Lorenzo, > > On Tue, Aug 05, 2025 at 06:31:56PM +0100, Lorenzo Stoakes wrote: > > There is pre-existing logic that appears to be undocumented for an mremap() > > shrink operation, where it turns out that the usual 'input range must span > > a single mapping' requirement no longer applies. > > > > In fact, it turns out that the input range specified by [old_address, > > old_address + old_size) may span any number of mappings. > > > > If shrinking in-place (that is, neither the MREMAP_FIXED nor > > MREMAP_DONTUNMAP flags are specified), then the new span may also span any > > number of VMAs - [old_address, old_address + new_size). > > > > If shrinking and moving, the range specified by [old_address, old_address + > > new_size) must span a single VMA. > > > > There must be at least one VMA contained within the [old_address, > > old_address + old_size) range, and old_address must be within the range of > > a VMA. > > > > Explicitly document this. > > > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > > Since this is documenting old behavior, could we have this patch before > the patch documenting new behavior? Or do you prefer it in this order? I think it's fine in this order, it's more convenient for me as it'd be a pain to re-order otherwise, and we've waited ~20 years (or longer?) to document this so a delay in ordering is probably fine :P Cheers, Lorenzo > > > Cheers, > Alex > > > --- > > man/man2/mremap.2 | 31 +++++++++++++++++++++++++++++-- > > 1 file changed, 29 insertions(+), 2 deletions(-) > > > > diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 > > index 6ba51310c..631c835b8 100644 > > --- a/man/man2/mremap.2 > > +++ b/man/man2/mremap.2 > > @@ -48,8 +48,35 @@ The > > .B MREMAP_DONTUNMAP > > flag may be specified. > > .P > > -If the operation is not > > -simply moving mappings, > > +Equally, if the operation performs a shrink, > > +that is if > > +.I old_size > > +is greater than > > +.IR new_size , > > +then > > +.I old_size > > +may also span multiple mappings > > +which do not have to be > > +adjacent to one another. > > +If this shrink is performed > > +in-place, > > +that is, > > +neither > > +.BR MREMAP_FIXED , > > +nor > > +.B MREMAP_DONTUNMAP > > +are specified, > > +.I new_size > > +may also span multiple VMAs. > > +However, if the range is moved, > > +then > > +.I new_size > > +must span only a single mapping. > > +.P > > +If the operation is neither a > > +.B MREMAP_FIXED > > +move > > +nor a shrink, > > then > > .I old_size > > must span only a single mapping. > > -- > > 2.50.1 > > > > -- > <https://www.alejandro-colomar.es/>
On Mon, Aug 11, 2025 at 06:31:25AM +0100, Lorenzo Stoakes wrote: > > Since this is documenting old behavior, could we have this patch before > > the patch documenting new behavior? Or do you prefer it in this order? > > I think it's fine in this order, it's more convenient for me as it'd be a pain > to re-order otherwise, and we've waited ~20 years (or longer?) to document this > so a delay in ordering is probably fine :P > > Cheers, Lorenzo Okay, that's fine. Thanks! Cheers, Alex -- <https://www.alejandro-colomar.es/>
© 2016 - 2025 Red Hat, Inc.