]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man2/madvise.2
grfix
[thirdparty/man-pages.git] / man2 / madvise.2
index f4bba0b81cb2166a3c4503b126e78f75ecb9b95c..69819d898e21b32d4b9104989e64b46daa594023 100644 (file)
@@ -10,7 +10,7 @@
 .\" manual under the conditions for verbatim copying, provided that the
 .\" entire resulting derived work is distributed under the terms of a
 .\" permission notice identical to this one.
-.\" 
+.\"
 .\" Since the Linux kernel and libraries are constantly changing, this
 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
 .\" responsibility for errors or omissions, or for damages resulting from
 .\" have taken the same level of care in the production of this manual,
 .\" which is licensed free of charge, as they might when working
 .\" professionally.
-.\" 
+.\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
 .\"
 .\" Based on comments from mm/filemap.c. Last modified on 10-06-2001
-.\" Modified, 25 Feb 2002, Michael Kerrisk, <mtk-manpages@gmx.net>
+.\" Modified, 25 Feb 2002, Michael Kerrisk, <mtk.manpages@gmail.com>
 .\"    Added notes on MADV_DONTNEED
 .\"
-.TH MADVISE 2 2001-06-10 "Linux 2.4.5" "Linux Programmer's Manual"
+.TH MADVISE 2 2007-07-26 "Linux" "Linux Programmer's Manual"
 .SH NAME
 madvise \- give advice about use of memory
 .SH SYNOPSIS
@@ -34,6 +34,14 @@ madvise \- give advice about use of memory
 .B #include <sys/mman.h>
 .sp
 .BI "int madvise(void *" start ", size_t " length ", int " advice );
+.sp
+.in -4n
+Feature Test Macro Requirements for glibc (see
+.BR feature_test_macros (7)):
+.in
+.sp
+.BR madvise ():
+_BSD_SOURCE
 .SH DESCRIPTION
 The
 .BR madvise ()
@@ -42,21 +50,24 @@ the address range beginning at address
 .I start
 and with size
 .I length
-bytes. It allows an application to tell the kernel how it expects to use
+bytes.
+It allows an application to tell the kernel how it expects to use
 some mapped or shared memory areas, so that the kernel can choose
 appropriate read-ahead and caching techniques.
-This call does not influence the semantics of the application 
+This call does not influence the semantics of the application
 (except in the case of
 .BR MADV_DONTNEED ),
 but
-may influence its performance. The kernel is free to ignore the advice.
+may influence its performance.
+The kernel is free to ignore the advice.
 .LP
-The advice is indicated in the 
+The advice is indicated in the
 .I advice
 parameter which can be
 .TP
 .B MADV_NORMAL
-No special treatment. This is the default.
+No special treatment.
+This is the default.
 .TP
 .B MADV_RANDOM
 Expect page references in random order.
@@ -77,12 +88,62 @@ Do not expect access in the near future.
 so the kernel can free resources associated with it.)
 Subsequent accesses of pages in this range will succeed, but will result
 either in re-loading of the memory contents from the underlying mapped file
-(see \fBmmap\fP) or zero-fill-on-demand pages for mappings
+(see
+.BR mmap (2))
+or zero-fill-on-demand pages for mappings
 without an underlying file.
+.TP
+.BR MADV_REMOVE " (Since Linux 2.6.16)"
+Free up a given range of pages
+and its associated backing store.
+Currently,
+.\" 2.6.18-rc5
+only shmfs/tmpfs supports this; other filesystems return with the
+error
+.BR ENOSYS .
+.\" Databases want to use this feature to drop a section of their
+.\" bufferpool (shared memory segments) - without writing back to
+.\" disk/swap space.  This feature is also useful for supporting
+.\" hot-plug memory on UML.
+.TP
+.BR MADV_DONTFORK " (Since Linux 2.6.16)"
+.\" See http://lwn.net/Articles/171941/
+Do not make the pages in this range available to the child after a
+.BR fork (2).
+This is useful to prevent copy-on-write semantics from changing
+the physical location of a page(s) if the parent writes to it after a
+.BR fork (2).
+(Such page relocations cause problems for hardware that
+DMAs into the page(s).)
+.\" [PATCH] madvise MADV_DONTFORK/MADV_DOFORK
+.\" Currently, copy-on-write may change the physical address of
+.\" a page even if the user requested that the page is pinned in
+.\" memory (either by mlock or by get_user_pages).  This happens
+.\" if the process forks meanwhile, and the parent writes to that
+.\" page.  As a result, the page is orphaned: in case of
+.\" get_user_pages, the application will never see any data hardware
+.\" DMA's into this page after the COW.  In case of mlock'd memory,
+.\" the parent is not getting the realtime/security benefits of mlock.
+.\"
+.\" In particular, this affects the Infiniband modules which do DMA from
+.\" and into user pages all the time.
+.\"
+.\" This patch adds madvise options to control whether memory range is
+.\" inherited across fork. Useful e.g. for when hardware is doing DMA
+.\" from/into these pages.  Could also be useful to an application
+.\" wanting to speed up its forks by cutting large areas out of
+.\" consideration.
+.TP
+.BR MADV_DOFORK " (Since Linux 2.6.16)"
+Undo the effect of
+.BR MADV_DONTFORK ,
+restoring the default behavior, whereby a mapping is inherited across
+.BR fork (2).
 .SH "RETURN VALUE"
-On success 
+On success
 .BR madvise ()
-returns zero. On error, it returns \-1 and
+returns zero.
+On error, it returns \-1 and
 .I errno
 is set appropriately.
 .SH ERRORS
@@ -94,57 +155,74 @@ A kernel resource was temporarily unavailable.
 The map exists, but the area maps something that isn't a file.
 .TP
 .B EINVAL
-The value 
-.IR len
+The value
+.I len
 is negative,
 .\" .I len
 .\" is zero,
 .I start
 is not page-aligned,
-.I advice 
+.I advice
 is not a valid value, or the application is attempting
-to release locked or shared pages (with MADV_DONTNEED).
+to release locked or shared pages (with
+.BR MADV_DONTNEED ).
 .TP
 .B EIO
-(for MADV_WILLNEED) Paging in this area would exceed the process's
+(for
+.BR MADV_WILLNEED )
+Paging in this area would exceed the process's
 maximum resident set size.
 .TP
 .B ENOMEM
-(for MADV_WILLNEED) Not enough memory: paging in failed.
+(for
+.BR MADV_WILLNEED )
+Not enough memory: paging in failed.
 .TP
 .B ENOMEM
 Addresses in the specified range are not currently
 mapped, or are outside the address space of the process.
-.SH "LINUX NOTES"
+.SH "CONFORMING TO"
+POSIX.1b.
+POSIX.1-2001 describes
+.BR posix_madvise (3)
+with constants
+.BR POSIX_MADV_NORMAL ,
+etc.,
+with a behavior close to that described here.
+There is a similar
+.BR posix_fadvise (2)
+for file access.
+
+.BR MADV_REMOVE ,
+.BR MADV_DONTFORK ,
+and
+.B MADV_DOFORK
+are Linux-specific.
+.SH NOTES
+.SS "Linux Notes"
 .LP
 The current Linux implementation (2.4.0) views this system call
 more as a command than as advice and hence may return an error
 when it cannot do what it usually would do in response to this
-advice. (See the ERRORS description above.)
-This is nonstandard behaviour.
+advice.
+(See the ERRORS description above.)
+This is nonstandard behavior.
 .LP
 The Linux implementation requires that the address
 .I start
 be page-aligned, and allows
 .I length
-to be zero. If there are some parts of the specified address range
+to be zero.
+If there are some parts of the specified address range
 that are not mapped, the Linux version of
 .BR madvise ()
-ignores them and applies the call to the rest (but returns 
+ignores them and applies the call to the rest (but returns
 .B ENOMEM
 from the system call, as it should).
-.SH HISTORY
-The
-.BR madvise ()
-function first appeared in 4.4BSD.
-.SH "CONFORMING TO"
-POSIX.1b (POSIX.4).
-POSIX 1003.1-2001 describes
-.B posix_madvise
-with constants POSIX_MADV_NORMAL, etc.,
-with a behaviour close to that described here. There is a similar
-.I posix_fadvise
-for file access.
+.\" .SH HISTORY
+.\" The
+.\" .BR madvise ()
+.\" function first appeared in 4.4BSD.
 .SH "SEE ALSO"
 .BR getrlimit (2),
 .BR mincore (2),