* [PATCH v2 0/2] man/man2/mremap.2: describe multiple mapping move, shrink @ 2025-07-28 14:04 Lorenzo Stoakes 2025-07-28 14:04 ` [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move Lorenzo Stoakes 2025-07-28 14:04 ` [PATCH v2 2/2] man/man2/mremap.2: describe previous undocumented shrink behaviour Lorenzo Stoakes 0 siblings, 2 replies; 5+ messages in thread From: Lorenzo Stoakes @ 2025-07-28 14:04 UTC (permalink / raw) To: Alejandro Colomar Cc: linux-man, Andrew Morton, Peter Xu, Alexander Viro, Christian Brauner, Jan Kara, Liam R . Howlett, Vlastimil Babka, Jann Horn, Pedro Falcato, Rik van Riel, linux-mm, linux-kernel, linux-api We have added new functionality to mremap() in Linux 6.17, permitting the move of multiple VMAs when performing a pure move (that is - providing MREMAP_MAYMOVE | MREMAP_FIXED flags and specifying old_size == new_size). We document this new feature. Additionally, we document previously undocumented behaviour around shrinking of input VMA ranges which permits the input range to span multiple VMAs. v2: * Split out the two man page changes as requested by Alejandro. v1: https://lore.kernel.org/all/20250723174634.75054-1-lorenzo.stoakes@oracle.com/ Lorenzo Stoakes (2): man/man2/mremap.2: describe multiple mapping move man/man2/mremap.2: describe previous undocumented shrink behaviour man/man2/mremap.2 | 93 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 11 deletions(-) -- 2.50.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move 2025-07-28 14:04 [PATCH v2 0/2] man/man2/mremap.2: describe multiple mapping move, shrink Lorenzo Stoakes @ 2025-07-28 14:04 ` Lorenzo Stoakes 2025-07-28 20:34 ` Jann Horn 2025-07-28 14:04 ` [PATCH v2 2/2] man/man2/mremap.2: describe previous undocumented shrink behaviour Lorenzo Stoakes 1 sibling, 1 reply; 5+ messages in thread From: Lorenzo Stoakes @ 2025-07-28 14:04 UTC (permalink / raw) To: Alejandro Colomar Cc: linux-man, Andrew Morton, Peter Xu, Alexander Viro, Christian Brauner, Jan Kara, Liam R . Howlett, Vlastimil Babka, Jann Horn, Pedro Falcato, Rik van Riel, linux-mm, linux-kernel, linux-api Document the new behaviour introduced in Linux 6.17 whereby it is now possible to move multiple mappings in a single operation, as long as the operation is purely a move, that is old_size is equal to new_size and MREMAP_FIXED is specified. To make things clearer, also describe this 'pure move' operation, before expanding upon it to describe the newly introduced behaviour. This change also explains the limitations of of this method and the possibility of partial failure. Finally, we pluralise language where it makes sense to so the documentation does not contradict either this new capability nor the pre-existing edge case. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> --- man/man2/mremap.2 | 78 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 index 2168ca728..cb3412591 100644 --- a/man/man2/mremap.2 +++ b/man/man2/mremap.2 @@ -25,18 +25,41 @@ moving it at the same time (controlled by the argument and the available virtual address space). .P +Mappings can simply be moved by specifying equal +.I old_size +and +.I new_size +and specifying +.IR new_address , +see the description of +.B MREMAP_FIXED +below. +Since Linux 6.17, +while +.I old_address +must reside within a mapping, +.I old_size +may span multiple mappings +which do not have to be +adjacent to one another. +.P +If the operation is not a simple move +then +.I old_size +must span only a single mapping. +.P .I old_address -is the old address of the virtual memory block that you -want to expand (or shrink). +is the old address of the first virtual memory block that you +want to expand, shrink, and/or move. Note that .I old_address has to be page aligned. .I old_size -is the old size of the -virtual memory block. +is the size of the range containing +virtual memory blocks to be manipulated. .I new_size is the requested size of the -virtual memory block after the resize. +virtual memory blocks after the resize. An optional fifth argument, .IR new_address , may be provided; see the description of @@ -105,13 +128,43 @@ If is specified, then .B MREMAP_MAYMOVE must also be specified. +.IP +Since Linux 6.17, +if +.I old_size +is equal to +.I new_size +and +.B MREMAP_FIXED +is specified, then +.I old_size +may span beyond the mapping in which +.I old_address +resides. +In this case, +gaps between mappings in the original range +are maintained in the new range. +The whole operation is performed atomically +unless an error arises, +in which case the operation may be partially +completed, +that is, +some mappings may be moved and others not. +.IP + +Moving multiple mappings is not permitted if +any of those mappings have either +been registered with +.BR userfaultfd (2) , +or map drivers that +specify their own custom address mapping logic. .TP .BR MREMAP_DONTUNMAP " (since Linux 5.7)" .\" commit e346b3813067d4b17383f975f197a9aa28a3b077 This flag, which must be used in conjunction with .BR MREMAP_MAYMOVE , -remaps a mapping to a new address but does not unmap the mapping at -.IR old_address . +remaps mappings to a new address but does not unmap them +from their original address. .IP The .B MREMAP_DONTUNMAP @@ -149,13 +202,13 @@ mapped. See NOTES for some possible applications of .BR MREMAP_DONTUNMAP . .P -If the memory segment specified by +If the memory segments specified by .I old_address and .I old_size -is locked (using +are locked (using .BR mlock (2) -or similar), then this lock is maintained when the segment is +or similar), then this lock is maintained when the segments are resized and/or relocated. As a consequence, the amount of memory locked by the process may change. .SH RETURN VALUE @@ -188,7 +241,10 @@ virtual memory address for this process. You can also get .B EFAULT even if there exist mappings that cover the -whole address space requested, but those mappings are of different types. +whole address space requested, but those mappings are of different types, +and the +.BR mremap () +operation being performed does not support this. .TP .B EINVAL An invalid argument was given. -- 2.50.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move 2025-07-28 14:04 ` [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move Lorenzo Stoakes @ 2025-07-28 20:34 ` Jann Horn 2025-07-29 12:09 ` Lorenzo Stoakes 0 siblings, 1 reply; 5+ messages in thread From: Jann Horn @ 2025-07-28 20:34 UTC (permalink / raw) To: Lorenzo Stoakes Cc: Alejandro Colomar, linux-man, Andrew Morton, Peter Xu, Alexander Viro, Christian Brauner, Jan Kara, Liam R . Howlett, Vlastimil Babka, Pedro Falcato, Rik van Riel, linux-mm, linux-kernel, linux-api On Mon, Jul 28, 2025 at 4:05 PM Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: > Document the new behaviour introduced in Linux 6.17 whereby it is now > possible to move multiple mappings in a single operation, as long as the > operation is purely a move, that is old_size is equal to new_size and > MREMAP_FIXED is specified. > > To make things clearer, also describe this 'pure move' operation, before > expanding upon it to describe the newly introduced behaviour. > > This change also explains the limitations of of this method and the > possibility of partial failure. > > Finally, we pluralise language where it makes sense to so the documentation > does not contradict either this new capability nor the pre-existing edge > case. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > --- > man/man2/mremap.2 | 78 ++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 67 insertions(+), 11 deletions(-) > > diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 > index 2168ca728..cb3412591 100644 > --- a/man/man2/mremap.2 > +++ b/man/man2/mremap.2 > @@ -25,18 +25,41 @@ moving it at the same time (controlled by the > argument and > the available virtual address space). > .P > +Mappings can simply be moved by specifying equal (Bikeshedding: This "simply" sounds weird to me. If you're trying to define a "simple move" with this, the rest of this block is not very specific about what exactly that is supposed to be. In my opinion, "pure" would also be a nicer word than "simple" if you're looking for an expression that means "a move that doesn't do other things".) > +.I old_size > +and > +.I new_size > +and specifying > +.IR new_address , > +see the description of > +.B MREMAP_FIXED > +below. > +Since Linux 6.17, > +while > +.I old_address > +must reside within a mapping, > +.I old_size > +may span multiple mappings > +which do not have to be > +adjacent to one another. > +.P > +If the operation is not a simple move > +then > +.I old_size > +must span only a single mapping. I'm reading between the lines that "simple move" is supposed to mean "the size is not changing and MREMAP_DONTUNMAP is not set", which then implies that in order to actually make anything happen, MREMAP_FIXED must be specified? > +.P > .I old_address > -is the old address of the virtual memory block that you > -want to expand (or shrink). > +is the old address of the first virtual memory block that you > +want to expand, shrink, and/or move. > Note that > .I old_address > has to be page aligned. > .I old_size > -is the old size of the > -virtual memory block. > +is the size of the range containing > +virtual memory blocks to be manipulated. > .I new_size > is the requested size of the > -virtual memory block after the resize. > +virtual memory blocks after the resize. > An optional fifth argument, > .IR new_address , > may be provided; see the description of > @@ -105,13 +128,43 @@ If > is specified, then > .B MREMAP_MAYMOVE > must also be specified. > +.IP > +Since Linux 6.17, > +if > +.I old_size > +is equal to > +.I new_size > +and > +.B MREMAP_FIXED > +is specified, then > +.I old_size > +may span beyond the mapping in which > +.I old_address > +resides. > +In this case, > +gaps between mappings in the original range > +are maintained in the new range. > +The whole operation is performed atomically > +unless an error arises, > +in which case the operation may be partially > +completed, > +that is, > +some mappings may be moved and others not. This is much clearer to me. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move 2025-07-28 20:34 ` Jann Horn @ 2025-07-29 12:09 ` Lorenzo Stoakes 0 siblings, 0 replies; 5+ messages in thread From: Lorenzo Stoakes @ 2025-07-29 12:09 UTC (permalink / raw) To: Jann Horn Cc: Alejandro Colomar, linux-man, Andrew Morton, Peter Xu, Alexander Viro, Christian Brauner, Jan Kara, Liam R . Howlett, Vlastimil Babka, Pedro Falcato, Rik van Riel, linux-mm, linux-kernel, linux-api On Mon, Jul 28, 2025 at 10:34:07PM +0200, Jann Horn wrote: > On Mon, Jul 28, 2025 at 4:05 PM Lorenzo Stoakes > <lorenzo.stoakes@oracle.com> wrote: > > Document the new behaviour introduced in Linux 6.17 whereby it is now > > possible to move multiple mappings in a single operation, as long as the > > operation is purely a move, that is old_size is equal to new_size and > > MREMAP_FIXED is specified. > > > > To make things clearer, also describe this 'pure move' operation, before > > expanding upon it to describe the newly introduced behaviour. > > > > This change also explains the limitations of of this method and the > > possibility of partial failure. > > > > Finally, we pluralise language where it makes sense to so the documentation > > does not contradict either this new capability nor the pre-existing edge > > case. > > > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > > --- > > man/man2/mremap.2 | 78 ++++++++++++++++++++++++++++++++++++++++------- > > 1 file changed, 67 insertions(+), 11 deletions(-) > > > > diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 > > index 2168ca728..cb3412591 100644 > > --- a/man/man2/mremap.2 > > +++ b/man/man2/mremap.2 > > @@ -25,18 +25,41 @@ moving it at the same time (controlled by the > > argument and > > the available virtual address space). > > .P > > +Mappings can simply be moved by specifying equal > > (Bikeshedding: This "simply" sounds weird to me. If you're trying to > define a "simple move" with this, the rest of this block is not very > specific about what exactly that is supposed to be. In my opinion, > "pure" would also be a nicer word than "simple" if you're looking for > an expression that means "a move that doesn't do other things".) Will rephrase, the intent is that I'm saying we can 'simply' perform the 'only move'. > > > +.I old_size > > +and > > +.I new_size > > +and specifying > > +.IR new_address , > > +see the description of > > +.B MREMAP_FIXED > > +below. > > +Since Linux 6.17, > > +while > > +.I old_address > > +must reside within a mapping, > > +.I old_size > > +may span multiple mappings > > +which do not have to be > > +adjacent to one another. > > +.P > > +If the operation is not a simple move > > +then > > +.I old_size > > +must span only a single mapping. > > I'm reading between the lines that "simple move" is supposed to mean > "the size is not changing and MREMAP_DONTUNMAP is not set", which then > implies that in order to actually make anything happen, MREMAP_FIXED > must be specified? No, MREMAP_DONTUNMAP can be set, but MREMAP_FIXED must always be set for this to happen. Let me rephrase for clarity. > > > +.P > > .I old_address > > -is the old address of the virtual memory block that you > > -want to expand (or shrink). > > +is the old address of the first virtual memory block that you > > +want to expand, shrink, and/or move. > > Note that > > .I old_address > > has to be page aligned. > > .I old_size > > -is the old size of the > > -virtual memory block. > > +is the size of the range containing > > +virtual memory blocks to be manipulated. > > .I new_size > > is the requested size of the > > -virtual memory block after the resize. > > +virtual memory blocks after the resize. > > An optional fifth argument, > > .IR new_address , > > may be provided; see the description of > > @@ -105,13 +128,43 @@ If > > is specified, then > > .B MREMAP_MAYMOVE > > must also be specified. > > +.IP > > +Since Linux 6.17, > > +if > > +.I old_size > > +is equal to > > +.I new_size > > +and > > +.B MREMAP_FIXED > > +is specified, then > > +.I old_size > > +may span beyond the mapping in which > > +.I old_address > > +resides. > > +In this case, > > +gaps between mappings in the original range > > +are maintained in the new range. > > +The whole operation is performed atomically > > +unless an error arises, > > +in which case the operation may be partially > > +completed, > > +that is, > > +some mappings may be moved and others not. > > This is much clearer to me. Thanks ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] man/man2/mremap.2: describe previous undocumented shrink behaviour 2025-07-28 14:04 [PATCH v2 0/2] man/man2/mremap.2: describe multiple mapping move, shrink Lorenzo Stoakes 2025-07-28 14:04 ` [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move Lorenzo Stoakes @ 2025-07-28 14:04 ` Lorenzo Stoakes 1 sibling, 0 replies; 5+ messages in thread From: Lorenzo Stoakes @ 2025-07-28 14:04 UTC (permalink / raw) To: Alejandro Colomar Cc: linux-man, Andrew Morton, Peter Xu, Alexander Viro, Christian Brauner, Jan Kara, Liam R . Howlett, Vlastimil Babka, Jann Horn, Pedro Falcato, Rik van Riel, linux-mm, linux-kernel, linux-api 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_size) may span any number of mappings, as long old_address resides at or within a mapping and [old_address, new_size) spans only a single mapping. Explicitly document this. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> --- man/man2/mremap.2 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/man/man2/mremap.2 b/man/man2/mremap.2 index cb3412591..c1a9e7397 100644 --- a/man/man2/mremap.2 +++ b/man/man2/mremap.2 @@ -43,7 +43,22 @@ may span multiple mappings which do not have to be adjacent to one another. .P -If the operation is not a simple move +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. +However in this case, +.I new_size +must span only a single mapping. +.P +If the operation is neither a simple move +nor a shrink, then .I old_size must span only a single mapping. -- 2.50.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-07-29 12:10 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-07-28 14:04 [PATCH v2 0/2] man/man2/mremap.2: describe multiple mapping move, shrink Lorenzo Stoakes 2025-07-28 14:04 ` [PATCH v2 1/2] man/man2/mremap.2: describe multiple mapping move Lorenzo Stoakes 2025-07-28 20:34 ` Jann Horn 2025-07-29 12:09 ` Lorenzo Stoakes 2025-07-28 14:04 ` [PATCH v2 2/2] man/man2/mremap.2: describe previous undocumented shrink behaviour Lorenzo Stoakes
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).