From 7a3e8caae4f538ccac953f3b1a5bdcb28cf974e0 Mon Sep 17 00:00:00 2001 From: Eric B Munson Date: Mon, 9 Nov 2015 13:27:35 -0500 Subject: [PATCH] mlock.2, mlock2.2: Document mlock2(2) and MCL_ONFAULT Update the mlock(2) man page with information on mlock2() and the new mlockall() flag MCL_ONFAULT. Signed-off-by: Eric B Munson Acked-by: Michal Hocko Acked-by: Vlastimil Babka Cc: Michal Hocko Cc: Vlastimil Babka Cc: Jonathan Corbet Cc: linux-man@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Michael Kerrisk --- man2/mlock.2 | 110 +++++++++++++++++++++++++++++++++++++++++++++----- man2/mlock2.2 | 1 + 2 files changed, 100 insertions(+), 11 deletions(-) create mode 100644 man2/mlock2.2 diff --git a/man2/mlock.2 b/man2/mlock.2 index 79c544df9..b9e5f8b0a 100644 --- a/man2/mlock.2 +++ b/man2/mlock.2 @@ -23,21 +23,23 @@ .\" . .\" %%%LICENSE_END .\" -.TH MLOCK 2 2015-07-23 "Linux" "Linux Programmer's Manual" +.TH MLOCK 2 2015-08-28 "Linux" "Linux Programmer's Manual" .SH NAME -mlock, munlock, mlockall, munlockall \- lock and unlock memory +mlock, mlock2, munlock, mlockall, munlockall \- lock and unlock memory .SH SYNOPSIS .nf .B #include .sp .BI "int mlock(const void *" addr ", size_t " len ); +.BI "int mlock2(const void *" addr ", size_t " len ", int " flags ); .BI "int munlock(const void *" addr ", size_t " len ); .sp .BI "int mlockall(int " flags ); .B int munlockall(void); .fi .SH DESCRIPTION -.BR mlock () +.BR mlock (), +.BR mlock2 (), and .BR mlockall () respectively lock part or all of the calling process's virtual address @@ -51,7 +53,7 @@ respectively unlocking part or all of the calling process's virtual address space, so that pages in the specified virtual address range may once more to be swapped out if required by the kernel memory manager. Memory locking and unlocking are performed in units of whole pages. -.SS mlock() and munlock() +.SS mlock(), mlock2(), and munlock() .BR mlock () locks pages in the address range starting at .I addr @@ -62,6 +64,39 @@ All pages that contain a part of the specified address range are guaranteed to be resident in RAM when the call returns successfully; the pages are guaranteed to stay in RAM until later unlocked. +.BR mlock2 () +also locks pages in the specified range starting at +.I addr +and continuing for +.I len +bytes. +However, the state of the pages contained in that range after the call +returns successfully will depend on the value in the +.I flags +argument. + +The +.I flags +argument can be either 0 or the following constant: +.TP 1.2i +.B MLOCK_ONFAULT +Lock pages that are currently resident and mark the entire range to have +pages locked when they are populated by the page fault. +.PP + +If +.I flags +is 0, +.BR mlock2 () +will function exactly as +.BR mlock () +would. + +Note: Currently, there is not a glibc wrapper for +.BR mlock2 () +so it will need to be invoked using +.BR syscall (2) + .BR munlock () unlocks pages in the address range starting at .I addr @@ -93,9 +128,33 @@ the process. .B MCL_FUTURE Lock all pages which will become mapped into the address space of the process in the future. -These could be for instance new pages required +These could be, for instance, new pages required by a growing heap and stack as well as new memory-mapped files or shared memory regions. +.TP +.BR MCL_ONFAULT " (since Linux 4.4)" +Used together with +.BR MCL_CURRENT , +.BR MCL_FUTURE , +or both. Mark all current (with +.BR MCL_CURRENT ) +or future (with +.BR MCL_FUTURE ) +mappings to lock pages when they are faulted in. When used with +.BR MCL_CURRENT , +all present pages are locked, but +.BR mlockall () +will not fault in non-present pages. When used with +.BR MCL_FUTURE , +all future mappings will be marked to lock pages when they are faulted +in, but they will not be populated by the lock when the mapping is +created. +.B MCL_ONFAULT +must be used with either +.B MCL_CURRENT +or +.B MCL_FUTURE +or both. .PP If .B MCL_FUTURE @@ -148,7 +207,8 @@ to perform the requested operation. .\"SVr4 documents an additional EAGAIN error code. .LP For -.BR mlock () +.BR mlock (), +.BR mlock2 (), and .BR munlock (): .TP @@ -181,12 +241,23 @@ mapping would result in three mappings: two locked mappings at each end and an unlocked mapping in the middle.) .LP For -.BR mlockall (): +.BR mlock2 (): .TP .B EINVAL Unknown \fIflags\fP were specified. .LP For +.BR mlockall (): +.TP +.B EINVAL +Unknown \fIflags\fP were specified or +.B MCL_ONFAULT +was specified without either +.B MCL_FUTURE +or +.BR MCL_CURRENT . +.LP +For .BR munlockall (): .TP .B EPERM @@ -259,9 +330,11 @@ or when the process terminates. The .BR mlockall () .B MCL_FUTURE -setting is not inherited by a child created via +and +.B MCL_FUTURE | MCL_ONFAULT +settings are not inherited by a child created via .BR fork (2) -and is cleared during an +and are cleared during an .BR execve (2). The memory lock on an address range is automatically removed @@ -270,7 +343,8 @@ if the address range is unmapped via Memory locks do not stack, that is, pages which have been locked several times by calls to -.BR mlock () +.BR mlock (), +.BR mlock2 (), or .BR mlockall () will be unlocked by a single call to @@ -280,9 +354,19 @@ for the corresponding range or by Pages which are mapped to several locations or by several processes stay locked into RAM as long as they are locked at least at one location or by at least one process. + +If a call to +.BR mlockall () +which uses the +.B MCL_FUTURE +flag is followed by another call that does not specify this flag, the +changes made by the +.B MCL_FUTURE +call will be lost. .SS Linux notes Under Linux, -.BR mlock () +.BR mlock (), +.BR mlock2 (), and .BR munlock () automatically round @@ -300,6 +384,7 @@ file shows how many kilobytes of memory the process with ID .I PID has locked using .BR mlock (), +.BR mlock2 (), .BR mlockall (), and .BR mmap (2) @@ -342,6 +427,9 @@ resource limit is encountered. .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2 .\" "Rationale for RLIMIT_MEMLOCK" .\" 23 Jan 2006 +.SH VERSIONS +.BR mlock2 (2) +is available since Linux 4.4. .SH SEE ALSO .BR mmap (2), .BR setrlimit (2), diff --git a/man2/mlock2.2 b/man2/mlock2.2 new file mode 100644 index 000000000..5e5b3c741 --- /dev/null +++ b/man2/mlock2.2 @@ -0,0 +1 @@ +.so man2/mlock.2