# migrate_pages

## NAME



           migrate_pages - move all pages in a process to another set of
           nodes
    


## LIBRARY



           NUMA (Non-Uniform Memory Access) policy library (_libnuma_ , _-lnuma_)
    


## SYNOPSIS



           **#include <numaif.h>**
    
           **long migrate_pages(int** _pid_**, unsigned long** _maxnode,_
                              **const unsigned long ***_old_nodes,_
                              **const unsigned long ***_new_nodes_**);**
    


## DESCRIPTION



           **migrate_pages**() attempts to move all pages of the process _pid_ that
           are in memory nodes _old_nodes_ to the memory nodes in _new_nodes_.
           Pages not located in any node in _old_nodes_ will not be migrated.
           As far as possible, the kernel maintains the relative topology
           relationship inside _old_nodes_ during the migration to _new_nodes_.
    
           The _old_nodes_ and _new_nodes_ arguments are pointers to bit masks of
           node numbers, with up to _maxnode_ bits in each mask.  These masks
           are maintained as arrays of unsigned _long_ integers (in the last
           _long_ integer, the bits beyond those specified by _maxnode_ are
           ignored).  The _maxnode_ argument is the maximum node number in the
           bit mask plus one (this is the same as in mbind(2), but different
           from select(2)).
    
           The _pid_ argument is the ID of the process whose pages are to be
           moved.  To move pages in another process, the caller must be
           privileged (**CAP_SYS_NICE**) or the real or effective user ID of the
           calling process must match the real or saved-set user ID of the
           target process.  If _pid_ is 0, then **migrate_pages**() moves pages of
           the calling process.
    
           Pages shared with another process will be moved only if the
           initiating process has the **CAP_SYS_NICE** privilege.
    


## RETURN VALUE



           On success **migrate_pages**() returns the number of pages that could
           not be moved (i.e., a return of zero means that all pages were
           successfully moved).  On error, it returns -1, and sets _errno_ to
           indicate the error.
    


## ERRORS



           **EFAULT** Part or all of the memory range specified by
                  _old_nodes_ /_new_nodes_ and _maxnode_ points outside your
                  accessible address space.
    
           **EINVAL** The value specified by _maxnode_ exceeds a kernel-imposed
                  limit.  Or, _old_nodes_ or _new_nodes_ specifies one or more
                  node IDs that are greater than the maximum supported node
                  ID.  Or, none of the node IDs specified by _new_nodes_ are
                  on-line and allowed by the process's current cpuset
                  context, or none of the specified nodes contain memory.
    
           **EPERM** Insufficient privilege (**CAP_SYS_NICE**) to move pages of the
                  process specified by _pid_ , or insufficient privilege
                  (**CAP_SYS_NICE**) to access the specified target nodes.
    
           **ESRCH** No process matching _pid_ could be found.
    


## STANDARDS



           Linux.
    


## NOTES



           For information on library support, see numa(7).
    
           Use get_mempolicy(2) with the **MPOL_F_MEMS_ALLOWED** flag to obtain
           the set of nodes that are allowed by the calling process's cpuset.
           Note that this information is subject to change at any time by
           manual or automatic reconfiguration of the cpuset.
    
           Use of **migrate_pages**() may result in pages whose location (node)
           violates the memory policy established for the specified addresses
           (see mbind(2)) and/or the specified process (see
           set_mempolicy(2)).  That is, memory policy does not constrain the
           destination nodes used by **migrate_pages**().
    
           The _< numaif.h>_ header is not included with glibc, but requires
           installing _libnuma-devel_ or a similar package.
    


* * *