blob: 51f18779d43adbb07b61afc16d3044e6ef776688 [file] [log] [blame]
<html lang="en">
<head>
<title>Page Lock Functions - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Locking-Pages.html#Locking-Pages" title="Locking Pages">
<link rel="prev" href="Locked-Memory-Details.html#Locked-Memory-Details" title="Locked Memory Details">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Page-Lock-Functions"></a>
<p>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Locked-Memory-Details.html#Locked-Memory-Details">Locked Memory Details</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Locking-Pages.html#Locking-Pages">Locking Pages</a>
<hr>
</div>
<h4 class="subsection">3.4.3 Functions To Lock And Unlock Pages</h4>
<p>The symbols in this section are declared in <samp><span class="file">sys/mman.h</span></samp>. These
functions are defined by POSIX.1b, but their availability depends on
your kernel. If your kernel doesn't allow these functions, they exist
but always fail. They <em>are</em> available with a Linux kernel.
<p><strong>Portability Note:</strong> POSIX.1b requires that when the <code>mlock</code>
and <code>munlock</code> functions are available, the file <samp><span class="file">unistd.h</span></samp>
define the macro <code>_POSIX_MEMLOCK_RANGE</code> and the file
<code>limits.h</code> define the macro <code>PAGESIZE</code> to be the size of a
memory page in bytes. It requires that when the <code>mlockall</code> and
<code>munlockall</code> functions are available, the <samp><span class="file">unistd.h</span></samp> file
define the macro <code>_POSIX_MEMLOCK</code>. The GNU C library conforms to
this requirement.
<!-- sys/mman.h -->
<!-- POSIX.1b -->
<div class="defun">
&mdash; Function: int <b>mlock</b> (<var>const void *addr, size_t len</var>)<var><a name="index-mlock-359"></a></var><br>
<blockquote>
<p><code>mlock</code> locks a range of the calling process' virtual pages.
<p>The range of memory starts at address <var>addr</var> and is <var>len</var> bytes
long. Actually, since you must lock whole pages, it is the range of
pages that include any part of the specified range.
<p>When the function returns successfully, each of those pages is backed by
(connected to) a real frame (is resident) and is marked to stay that
way. This means the function may cause page-ins and have to wait for
them.
<p>When the function fails, it does not affect the lock status of any
pages.
<p>The return value is zero if the function succeeds. Otherwise, it is
<code>-1</code> and <code>errno</code> is set accordingly. <code>errno</code> values
specific to this function are:
<dl>
<dt><code>ENOMEM</code><dd>
<ul>
<li>At least some of the specified address range does not exist in the
calling process' virtual address space.
<li>The locking would cause the process to exceed its locked page limit.
</ul>
<br><dt><code>EPERM</code><dd>The calling process is not superuser.
<br><dt><code>EINVAL</code><dd><var>len</var> is not positive.
<br><dt><code>ENOSYS</code><dd>The kernel does not provide <code>mlock</code> capability.
</dl>
<p>You can lock <em>all</em> a process' memory with <code>mlockall</code>. You
unlock memory with <code>munlock</code> or <code>munlockall</code>.
<p>To avoid all page faults in a C program, you have to use
<code>mlockall</code>, because some of the memory a program uses is hidden
from the C code, e.g. the stack and automatic variables, and you
wouldn't know what address to tell <code>mlock</code>.
</blockquote></div>
<!-- sys/mman.h -->
<!-- POSIX.1b -->
<div class="defun">
&mdash; Function: int <b>munlock</b> (<var>const void *addr, size_t len</var>)<var><a name="index-munlock-360"></a></var><br>
<blockquote>
<p><code>munlock</code> unlocks a range of the calling process' virtual pages.
<p><code>munlock</code> is the inverse of <code>mlock</code> and functions completely
analogously to <code>mlock</code>, except that there is no <code>EPERM</code>
failure.
</blockquote></div>
<!-- sys/mman.h -->
<!-- POSIX.1b -->
<div class="defun">
&mdash; Function: int <b>mlockall</b> (<var>int flags</var>)<var><a name="index-mlockall-361"></a></var><br>
<blockquote>
<p><code>mlockall</code> locks all the pages in a process' virtual memory address
space, and/or any that are added to it in the future. This includes the
pages of the code, data and stack segment, as well as shared libraries,
user space kernel data, shared memory, and memory mapped files.
<p><var>flags</var> is a string of single bit flags represented by the following
macros. They tell <code>mlockall</code> which of its functions you want. All
other bits must be zero.
<dl>
<dt><code>MCL_CURRENT</code><dd>Lock all pages which currently exist in the calling process' virtual
address space.
<br><dt><code>MCL_FUTURE</code><dd>Set a mode such that any pages added to the process' virtual address
space in the future will be locked from birth. This mode does not
affect future address spaces owned by the same process so exec, which
replaces a process' address space, wipes out <code>MCL_FUTURE</code>.
See <a href="Executing-a-File.html#Executing-a-File">Executing a File</a>.
</dl>
<p>When the function returns successfully, and you specified
<code>MCL_CURRENT</code>, all of the process' pages are backed by (connected
to) real frames (they are resident) and are marked to stay that way.
This means the function may cause page-ins and have to wait for them.
<p>When the process is in <code>MCL_FUTURE</code> mode because it successfully
executed this function and specified <code>MCL_CURRENT</code>, any system call
by the process that requires space be added to its virtual address space
fails with <code>errno</code> = <code>ENOMEM</code> if locking the additional space
would cause the process to exceed its locked page limit. In the case
that the address space addition that can't be accommodated is stack
expansion, the stack expansion fails and the kernel sends a
<code>SIGSEGV</code> signal to the process.
<p>When the function fails, it does not affect the lock status of any pages
or the future locking mode.
<p>The return value is zero if the function succeeds. Otherwise, it is
<code>-1</code> and <code>errno</code> is set accordingly. <code>errno</code> values
specific to this function are:
<dl>
<dt><code>ENOMEM</code><dd>
<ul>
<li>At least some of the specified address range does not exist in the
calling process' virtual address space.
<li>The locking would cause the process to exceed its locked page limit.
</ul>
<br><dt><code>EPERM</code><dd>The calling process is not superuser.
<br><dt><code>EINVAL</code><dd>Undefined bits in <var>flags</var> are not zero.
<br><dt><code>ENOSYS</code><dd>The kernel does not provide <code>mlockall</code> capability.
</dl>
<p>You can lock just specific pages with <code>mlock</code>. You unlock pages
with <code>munlockall</code> and <code>munlock</code>.
</blockquote></div>
<!-- sys/mman.h -->
<!-- POSIX.1b -->
<div class="defun">
&mdash; Function: int <b>munlockall</b> (<var>void</var>)<var><a name="index-munlockall-362"></a></var><br>
<blockquote>
<p><code>munlockall</code> unlocks every page in the calling process' virtual
address space and turn off <code>MCL_FUTURE</code> future locking mode.
<p>The return value is zero if the function succeeds. Otherwise, it is
<code>-1</code> and <code>errno</code> is set accordingly. The only way this
function can fail is for generic reasons that all functions and system
calls can fail, so there are no specific <code>errno</code> values.
</blockquote></div>
</body></html>