Provided by: manpages-dev_3.54-1ubuntu1_all bug

NAME

       madvise - give advice about use of memory

SYNOPSIS

       #include <sys/mman.h>

       int madvise(void *addr, size_t length, int advice);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       madvise(): _BSD_SOURCE

DESCRIPTION

       The madvise() system call advises the kernel about how to handle paging input/output in the address range
       beginning at address addr and with size length 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  (except  in  the
       case of MADV_DONTNEED), but may influence its performance.  The kernel is free to ignore the advice.

       The advice is indicated in the advice argument which can be

       MADV_NORMAL
              No special treatment.  This is the default.

       MADV_RANDOM
              Expect page references in random order.  (Hence, read ahead may be less useful than normally.)

       MADV_SEQUENTIAL
              Expect  page references in sequential order.  (Hence, pages in the given range can be aggressively
              read ahead, and may be freed soon after they are accessed.)

       MADV_WILLNEED
              Expect access in the near future.  (Hence, it might be a good idea to read some pages ahead.)

       MADV_DONTNEED
              Do not expect access in the near future.  (For the time being, the application  is  finished  with
              the  given  range,  so  the kernel can free resources associated with it.)  Subsequent accesses of
              pages in this range will succeed, but will result either in reloading of the memory contents  from
              the  underlying  mapped  file  (see  mmap(2)) or zero-fill-on-demand pages for mappings without an
              underlying file.

       MADV_REMOVE (Since Linux 2.6.16)
              Free up a given range of pages and its associated  backing  store.   Currently,  only  shmfs/tmpfs
              supports this; other filesystems return with the error ENOSYS.

       MADV_DONTFORK (Since Linux 2.6.16)
              Do  not  make  the  pages in this range available to the child after a 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 fork(2).  (Such page relocations cause problems for hardware that DMAs into
              the page(s).)

       MADV_DOFORK (Since Linux 2.6.16)
              Undo the effect of MADV_DONTFORK, restoring the default behavior, whereby a mapping  is  inherited
              across fork(2).

       MADV_HWPOISON (Since Linux 2.6.32)
              Poison  a  page and handle it like a hardware memory corruption.  This operation is available only
              for privileged (CAP_SYS_ADMIN) processes.  This  operation  may  result  in  the  calling  process
              receiving  a  SIGBUS  and the page being unmapped.  This feature is intended for testing of memory
              error-handling code; it is available only if the kernel was configured with CONFIG_MEMORY_FAILURE.

       MADV_SOFT_OFFLINE (Since Linux 2.6.33)
              Soft offline the pages in the range specified by addr and length.  The memory of each page in  the
              specified range is preserved (i.e., when next accessed, the same content will be visible, but in a
              new physical page frame), and the original page is offlined (i.e., no longer used, and  taken  out
              of  normal  memory  management).   The  effect  of the MADV_SOFT_OFFLINE operation is invisible to
              (i.e., does not change the semantics of) the  calling  process.   This  feature  is  intended  for
              testing  of  memory  error-handling  code;  it is available only if the kernel was configured with
              CONFIG_MEMORY_FAILURE.

       MADV_MERGEABLE (since Linux 2.6.32)
              Enable Kernel Samepage Merging (KSM) for the pages in the range specified by addr and length.  The
              kernel  regularly scans those areas of user memory that have been marked as mergeable, looking for
              pages with identical content.  These are replaced by  a  single  write-protected  page  (which  is
              automatically copied if a process later wants to update the content of the page).  KSM merges only
              private anonymous pages (see mmap(2)).  The KSM feature is intended for applications that generate
              many  instances of the same data (e.g., virtualization systems such as KVM).  It can consume a lot
              of processing power; use with care.  See the Linux kernel source file Documentation/vm/ksm.txt for
              more details.  The MADV_MERGEABLE and MADV_UNMERGEABLE operations are available only if the kernel
              was configured with CONFIG_KSM.

       MADV_UNMERGEABLE (since Linux 2.6.32)
              Undo the effect of an earlier  MADV_MERGEABLE  operation  on  the  specified  address  range;  KSM
              unmerges whatever pages it had merged in the address range specified by addr and length.

       MADV_HUGEPAGE (since Linux 2.6.38)
              Enables  Transparent  Huge  Pages  (THP)  for  pages  in  the  range specified by addr and length.
              Currently, Transparent Huge Pages work only with  private  anonymous  pages  (see  mmap(2)).   The
              kernel  will  regularly  scan  the  areas marked as huge page candidates to replace them with huge
              pages.  The kernel will also allocate huge pages directly when the region is naturally aligned  to
              the  huge page size (see posix_memalign(2)).  This feature is primarily aimed at applications that
              use large mappings of data and access large regions of that memory at a time (e.g., virtualization
              systems  such  as  QEMU).   It  can  very  easily waste memory (e.g., a 2MB mapping that only ever
              accesses 1 byte will result in 2MB of wired memory instead of one 4KB page).  See the Linux kernel
              source   file   Documentation/vm/transhuge.txt   for   more   details.    The   MADV_HUGEPAGE  and
              MADV_NOHUGEPAGE  operations   are   available   only   if   the   kernel   was   configured   with
              CONFIG_TRANSPARENT_HUGEPAGE.

       MADV_NOHUGEPAGE (since Linux 2.6.38)
              Ensures  that  memory in the address range specified by addr and length will not be collapsed into
              huge pages.

       MADV_DONTDUMP (since Linux 3.4)
              Exclude from a core dump those pages in the range specified by addr and length.  This is useful in
              applications  that have large areas of memory that are known not to be useful in a core dump.  The
              effect  of  MADV_DONTDUMP  takes  precedence  over  the   bit   mask   that   is   set   via   the
              /proc/PID/coredump_filter file (see core(5)).

       MADV_DODUMP (since Linux 3.4)
              Undo the effect of an earlier MADV_DONTDUMP.

RETURN VALUE

       On success madvise() returns zero.  On error, it returns -1 and errno is set appropriately.

ERRORS

       EAGAIN A kernel resource was temporarily unavailable.

       EBADF  The map exists, but the area maps something that isn't a file.

       EINVAL This error can occur for the following reasons:

              *  The value len is negative.

              *  addr is not page-aligned.

              *  advice is not a valid value

              *  The application is attempting to release locked or shared pages (with MADV_DONTNEED).

              *  MADV_MERGEABLE  or  MADV_UNMERGEABLE was specified in advice, but the kernel was not configured
                 with CONFIG_KSM.

       EIO    (for MADV_WILLNEED) Paging in this area would exceed the process's maximum resident set size.

       ENOMEM (for MADV_WILLNEED) Not enough memory: paging in failed.

       ENOMEM Addresses in the specified range are not currently mapped, or are outside the address space of the
              process.

CONFORMING TO

       POSIX.1b.   POSIX.1-2001  describes  posix_madvise(3)  with  constants  POSIX_MADV_NORMAL,  etc.,  with a
       behavior close to that described here.  There is a similar posix_fadvise(2) for file access.

       MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK, MADV_HWPOISON, MADV_MERGEABLE, and MADV_UNMERGEABLE  are  Linux-
       specific.

NOTES

   Linux notes
       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 behavior.

       The  Linux  implementation  requires that the address addr be page-aligned, and allows length to be zero.
       If there are some parts of the specified address  range  that  are  not  mapped,  the  Linux  version  of
       madvise()  ignores  them and applies the call to the rest (but returns ENOMEM from the system call, as it
       should).

SEE ALSO

       getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2), core(5)

COLOPHON

       This page is part of release 3.54 of the Linux man-pages project.  A  description  of  the  project,  and
       information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.