
What is Linux Memory Policy?

In the Linux kernel, "memory policy" determines from which node the kernel will
allocate memory in a NUMA system or in an emulated NUMA system.  Linux has
supported platforms with Non-Uniform Memory Access architectures since 2.4.?.
The current memory policy support was added to Linux 2.6 around May 2004.  This
document attempts to describe the concepts and APIs of the 2.6 memory policy
support.

Memory policies should not be confused with cpusets (Documentation/cpusets.txt)
which is an administrative mechanism for restricting the nodes from which
memory may be allocated by a set of processes. Memory policies are a
programming interface that a NUMA-aware application can take advantage of.  When
both cpusets and policies are applied to a task, the restrictions of the cpuset
takes priority.  See "MEMORY POLICIES AND CPUSETS" below for more details.

MEMORY POLICY CONCEPTS

Scope of Memory Policies

The Linux kernel supports _scopes_ of memory policy, described here from
most general to most specific:

    System Default Policy:  this policy is "hard coded" into the kernel.  It
    is the policy that governs all page allocations that aren't controlled
    by one of the more specific policy scopes discussed below.  When the
    system is "up and running", the system default policy will use "local
    allocation" described below.  However, during boot up, the system
    default policy will be set to interleave allocations across all nodes
    with "sufficient" memory, so as not to overload the initial boot node
    with boot-time allocations.

    Task/Process Policy:  this is an optional, per-task policy.  When defined
    for a specific task, this policy controls all page allocations made by or
    on behalf of the task that aren't controlled by a more specific scope.
    If a task does not define a task policy, then all page allocations that
    would have been controlled by the task policy "fall back" to the System
    Default Policy.

	The task policy applies to the entire address space of a task. Thus,
	it is inheritable, and indeed is inherited, across both fork()
	[clone() w/o the CLONE_VM flag] and exec*().  This allows a parent task
	to establish the task policy for a child task exec()'d from an
	executable image that has no awareness of memory policy.  See the
	MEMORY POLICY APIS section, below, for an overview of the system call
	that a task may use to set/change it's task/process policy.

	In a multi-threaded task, task policies apply only to the thread
	[Linux kernel task] that installs the policy and any threads
	subsequently created by that thread.  Any sibling threads existing
	at the time a new task policy is installed retain their current
	policy.

	A task policy applies only to pages allocated after the policy is
	installed.  Any pages already faulted in by the task when the task
	changes its task policy remain where they were allocated based on
	the policy at the time they were allocated.

    VMA Policy:  A "VMA" or "Virtual Memory Area" refers to a range of a task's
    virtual adddress space.  A task may define a specific policy for a range
    of its virtual address space.   See the MEMORY POLICIES APIS section,
    below, for an overview of the mbind() system call used to set a VMA
    policy.

    A VMA policy will govern the allocation of pages that back this region of
    the address space.  Any regions of the task's address space that don't
    have an explicit VMA policy will fall back to the task policy, which may
    itself fall back to the System Default Policy.

    VMA policies have a few complicating details:

	VMA policy applies ONLY to anonymous pages.  These include pages
	allocated for anonymous segments, such as the task stack and heap, and
	any regions of the address space mmap()ed with the MAP_ANONYMOUS flag.
	If a VMA policy is applied to a file mapping, it will be ignored if
	the mapping used the MAP_SHARED flag.  If the file mapping used the
	MAP_PRIVATE flag, the VMA policy will only be applied when an
	anonymous page is allocated on an attempt to write to the mapping--
	i.e., at Copy-On-Write.

	VMA policies are shared between all tasks that share a virtual address
	space--a.k.a. threads--independent of when the policy is installed; and
	they are inherited across fork().  However, because VMA policies refer
	to a specific region of a task's address space, and because the address
	space is discarded and recreated on exec*(), VMA policies are NOT
	inheritable across exec().  Thus, only NUMA-aware applications may
	use VMA policies.

	A task may install a new VMA policy on a sub-range of a previously
	mmap()ed region.  When this happens, Linux splits the existing virtual
	memory area into 2 or 3 VMAs, each with it's own policy.

	By default, VMA policy applies only to pages allocated after the policy
	is installed.  Any pages already faulted into the VMA range remain
	where they were allocated based on the policy at the time they were
	allocated.  However, since 2.6.16, Linux supports page migration via
	the mbind() system call, so that page contents can be moved to match
	a newly installed policy.

    Shared Policy:  Conceptually, shared policies apply to "memory objects"
    mapped shared into one or more tasks' distinct address spaces.  An
    application installs a shared policies the same way as VMA policies--using
    the mbind() system call specifying a range of virtual addresses that map
    the shared object.  However, unlike VMA policies, which can be considered
    to be an attribute of a range of a task's address space, shared policies
    apply directly to the shared object.  Thus, all tasks that attach to the
    object share the policy, and all pages allocated for the shared object,
    by any task, will obey the shared policy.

	As of 2.6.22, only shared memory segments, created by shmget() or
	mmap(MAP_ANONYMOUS|MAP_SHARED), support shared policy.  When shared
	policy support was added to Linux, the associated data structures were
	added to hugetlbfs shmem segments.  At the time, hugetlbfs did not
	support allocation at fault time--a.k.a lazy allocation--so hugetlbfs
	shmem segments were never "hooked up" to the shared policy support.
	Although hugetlbfs segments now support lazy allocation, their support
	for shared policy has not been completed.

	As mentioned above [re: VMA policies], allocations of page cache
	pages for regular files mmap()ed with MAP_SHARED ignore any VMA
	policy installed on the virtual address range backed by the shared
	file mapping.  Rather, shared page cache pages, including pages backing
	private mappings that have not yet been written by the task, follow
	task policy, if any, else System Default Policy.

	The shared policy infrastructure supports different policies on subset
	ranges of the shared object.  However, Linux still splits the VMA of
	the task that installs the policy for each range of distinct policy.
	Thus, different tasks that attach to a shared memory segment can have
	different VMA configurations mapping that one shared object.  This
	can be seen by examining the /proc/<pid>/numa_maps of tasks sharing
	a shared memory region, when one task has installed shared policy on
	one or more ranges of the region.

Components of Memory Policies

    A Linux memory policy consists of a "mode", optional mode flags, and an
    optional set of nodes.  The mode determines the behavior of the policy,
    the optional mode flags determine the behavior of the mode, and the
    optional set of nodes can be viewed as the arguments to the policy
    behavior.

   Internally, memory policies are implemented by a reference counted
   structure, struct mempolicy.  Details of this structure will be discussed
   in context, below, as required to explain the behavior.

   Linux memory policy supports the following 4 behavioral modes:

	Default Mode--MPOL_DEFAULT:  This mode is only used in the memory
	policy APIs.  Internally, MPOL_DEFAULT is converted to the NULL
	memory policy in all policy scopes.  Any existing non-default policy
	will simply be removed when MPOL_DEFAULT is specified.  As a result,
	MPOL_DEFAULT means "fall back to the next most specific policy scope."

	    For example, a NULL or default task policy will fall back to the
	    system default policy.  A NULL or default vma policy will fall
	    back to the task policy.

	    When specified in one of the memory policy APIs, the Default mode
	    does not use the optional set of nodes.

	    It is an error for the set of nodes specified for this policy to
	    be non-empty.

	MPOL_BIND:  This mode specifies that memory must come from the
	set of nodes specified by the policy.  Memory will be allocated from
	the node in the set with sufficient free memory that is closest to
	the node where the allocation takes place.

	MPOL_PREFERRED:  This mode specifies that the allocation should be
	attempted from the single node specified in the policy.  If that
	allocation fails, the kernel will search other nodes, in order of
	increasing distance from the preferred node based on information
	provided by the platform firmware.
	containing the cpu where the allocation takes place.

	    Internally, the Preferred policy uses a single node--the
	    preferred_node member of struct mempolicy.  When the internal
	    mode flag MPOL_F_LOCAL is set, the preferred_node is ignored and
	    the policy is interpreted as local allocation.  "Local" allocation
	    policy can be viewed as a Preferred policy that starts at the node
	    containing the cpu where the allocation takes place.

	    It is possible for the user to specify that local allocation is
	    always preferred by passing an empty nodemask with this mode.
	    If an empty nodemask is passed, the policy cannot use the
	    MPOL_F_STATIC_NODES or MPOL_F_RELATIVE_NODES flags described
	    below.

	MPOL_INTERLEAVED:  This mode specifies that page allocations be
	interleaved, on a page granularity, across the nodes specified in
	the policy.  This mode also behaves slightly differently, based on
	the context where it is used:

	    For allocation of anonymous pages and shared memory pages,
	    Interleave mode indexes the set of nodes specified by the policy
	    using the page offset of the faulting address into the segment
	    [VMA] containing the address modulo the number of nodes specified
	    by the policy.  It then attempts to allocate a page, starting at
	    the selected node, as if the node had been specified by a Preferred
	    policy or had been selected by a local allocation.  That is,
	    allocation will follow the per node zonelist.

	    For allocation of page cache pages, Interleave mode indexes the set
	    of nodes specified by the policy using a node counter maintained
	    per task.  This counter wraps around to the lowest specified node
	    after it reaches the highest specified node.  This will tend to
	    spread the pages out over the nodes specified by the policy based
	    on the order in which they are allocated, rather than based on any
	    page offset into an address range or file.  During system boot up,
	    the temporary interleaved system default policy works in this
	    mode.

   Linux memory policy supports the following optional mode flags:

	MPOL_F_STATIC_NODES:  This flag specifies that the nodemask passed by
	the user should not be remapped if the task or VMA's set of allowed
	nodes changes after the memory policy has been defined.

	    Without this flag, anytime a mempolicy is rebound because of a
	    change in the set of allowed nodes, the node (Preferred) or
	    nodemask (Bind, Interleave) is remapped to the new set of
	    allowed nodes.  This may result in nodes being used that were
	    previously undesired.

	    With this flag, if the user-specified nodes overlap with the
	    nodes allowed by the task's cpuset, then the memory policy is
	    applied to their intersection.  If the two sets of nodes do not
	    overlap, the Default policy is used.

	    For example, consider a task that is attached to a cpuset with
	    mems 1-3 that sets an Interleave policy over the same set.  If
	    the cpuset's mems change to 3-5, the Interleave will now occur
	    over nodes 3, 4, and 5.  With this flag, however, since only node
	    3 is allowed from the user's nodemask, the "interleave" only
	    occurs over that node.  If no nodes from the user's nodemask are
	    now allowed, the Default behavior is used.

	    MPOL_F_STATIC_NODES cannot be combined with the
	    MPOL_F_RELATIVE_NODES flag.  It also cannot be used for
	    MPOL_PREFERRED policies that were created with an empty nodemask
	    (local allocation).

	MPOL_F_RELATIVE_NODES:  This flag specifies that the nodemask passed
	by the user will be mapped relative to the set of the task or VMA's
	set of allowed nodes.  The kernel stores the user-passed nodemask,
	and if the allowed nodes changes, then that original nodemask will
	be remapped relative to the new set of allowed nodes.

	    Without this flag (and without MPOL_F_STATIC_NODES), anytime a
	    mempolicy is rebound because of a change in the set of allowed
	    nodes, the node (Preferred) or nodemask (Bind, Interleave) is
	    remapped to the new set of allowed nodes.  That remap may not
	    preserve the relative nature of the user's passed nodemask to its
	    set of allowed nodes upon successive rebinds: a nodemask of
	    1,3,5 may be remapped to 7-9 and then to 1-3 if the set of
	    allowed nodes is restored to its original state.

	    With this flag, the remap is done so that the node numbers from
	    the user's passed nodemask are relative to the set of allowed
	    nodes.  In other words, if nodes 0, 2, and 4 are set in the user's
	    nodemask, the policy will be effected over the first (and in the
	    Bind or Interleave case, the third and fifth) nodes in the set of
	    allowed nodes.  The nodemask passed by the user represents nodes
	    relative to task or VMA's set of allowed nodes.

	    If the user's nodemask includes nodes that are outside the range
	    of the new set of allowed nodes (for example, node 5 is set in
	    the user's nodemask when the set of allowed nodes is only 0-3),
	    then the remap wraps around to the beginning of the nodemask and,
	    if not already set, sets the node in the mempolicy nodemask.

	    For example, consider a task that is attached to a cpuset with
	    mems 2-5 that sets an Interleave policy over the same set with
	    MPOL_F_RELATIVE_NODES.  If the cpuset's mems change to 3-7, the
	    interleave now occurs over nodes 3,5-6.  If the cpuset's mems
	    then change to 0,2-3,5, then the interleave occurs over nodes
	    0,3,5.

	    Thanks to the consistent remapping, applications preparing
	    nodemasks to specify memory policies using this flag should
	    disregard their current, actual cpuset imposed memory placement
	    and prepare the nodemask as if they were always located on
	    memory nodes 0 to N-1, where N is the number of memory nodes the
	    policy is intended to manage.  Let the kernel then remap to the
	    set of memory nodes allowed by the task's cpuset, as that may
	    change over time.

	    MPOL_F_RELATIVE_NODES cannot be combined with the
	    MPOL_F_STATIC_NODES flag.  It also cannot be used for
	    MPOL_PREFERRED policies that were created with an empty nodemask
	    (local allocation).

MEMORY POLICY REFERENCE COUNTING

To resolve use/free races, struct mempolicy contains an atomic reference
count field.  Internal interfaces, mpol_get()/mpol_put() increment and
decrement this reference count, respectively.  mpol_put() will only free
the structure back to the mempolicy kmem cache when the reference count
goes to zero.

When a new memory policy is allocated, it's reference count is initialized
to '1', representing the reference held by the task that is installing the
new policy.  When a pointer to a memory policy structure is stored in another
structure, another reference is added, as the task's reference will be dropped
on completion of the policy installation.

During run-time "usage" of the policy, we attempt to minimize atomic operations
on the reference count, as this can lead to cache lines bouncing between cpus
and NUMA nodes.  "Usage" here means one of the following:

1) querying of the policy, either by the task itself [using the get_mempolicy()
   API discussed below] or by another task using the /proc/<pid>/numa_maps
   interface.

2) examination of the policy to determine the policy mode and associated node
   or node lists, if any, for page allocation.  This is considered a "hot
   path".  Note that for MPOL_BIND, the "usage" extends across the entire
   allocation process, which may sleep during page reclaimation, because the
   BIND policy nodemask is used, by reference, to filter ineligible nodes.

We can avoid taking an extra reference during the usages listed above as
follows:

1) we never need to get/free the system default policy as this is never
   changed nor freed, once the system is up and running.

2) for querying the policy, we do not need to take an extra reference on the
   target task's task policy nor vma policies because we always acquire the
   task's mm's mmap_sem for read during the query.  The set_mempolicy() and
   mbind() APIs [see below] always acquire the mmap_sem for write when
   installing or replacing task or vma policies.  Thus, there is no possibility
   of a task or thread freeing a policy while another task or thread is
   querying it.

3) Page allocation usage of task or vma policy occurs in the fault path where
   we hold them mmap_sem for read.  Again, because replacing the task or vma
   policy requires that the mmap_sem be held for write, the policy can't be
   freed out from under us while we're using it for page allocation.

4) Shared policies require special consideration.  One task can replace a
   shared memory policy while another task, with a distinct mmap_sem, is
   querying or allocating a page based on the policy.  To resolve this
   potential race, the shared policy infrastructure adds an extra reference
   to the shared policy during lookup while holding a spin lock on the shared
   policy management structure.  This requires that we drop this extra
   reference when we're finished "using" the policy.  We must drop the
   extra reference on shared policies in the same query/allocation paths
   used for non-shared policies.  For this reason, shared policies are marked
   as such, and the extra reference is dropped "conditionally"--i.e., only
   for shared policies.

   Because of this extra reference counting, and because we must lookup
   shared policies in a tree structure under spinlock, shared policies are
   more expensive to use in the page allocation path.  This is expecially
   true for shared policies on shared memory regions shared by tasks running
   on different NUMA nodes.  This extra overhead can be avoided by always
   falling back to task or system default policy for shared memory regions,
   or by prefaulting the entire shared memory region into memory and locking
   it down.  However, this might not be appropriate for all applications.

MEMORY POLICY APIs

Linux supports 3 system calls for controlling memory policy.  These APIS
always affect only the calling task, the calling task's address space, or
some shared object mapped into the calling task's address space.

	Note:  the headers that define these APIs and the parameter data types
	for user space applications reside in a package that is not part of
	the Linux kernel.  The kernel system call interfaces, with the 'sys_'
	prefix, are defined in <linux/syscalls.h>; the mode and flag
	definitions are defined in <linux/mempolicy.h>.

Set [Task] Memory Policy:

	long set_mempolicy(int mode, const unsigned long *nmask,
					unsigned long maxnode);

	Set's the calling task's "task/process memory policy" to mode
	specified by the 'mode' argument and the set of nodes defined
	by 'nmask'.  'nmask' points to a bit mask of node ids containing
	at least 'maxnode' ids.  Optional mode flags may be passed by
	combining the 'mode' argument with the flag (for example:
	MPOL_INTERLEAVE | MPOL_F_STATIC_NODES).

	See the set_mempolicy(2) man page for more details


Get [Task] Memory Policy or Related Information

	long get_mempolicy(int *mode,
			   const unsigned long *nmask, unsigned long maxnode,
			   void *addr, int flags);

	Queries the "task/process memory policy" of the calling task, or
	the policy or location of a specified virtual address, depending
	on the 'flags' argument.

	See the get_mempolicy(2) man page for more details


Install VMA/Shared Policy for a Range of Task's Address Space

	long mbind(void *start, unsigned long len, int mode,
		   const unsigned long *nmask, unsigned long maxnode,
		   unsigned flags);

	mbind() installs the policy specified by (mode, nmask, maxnodes) as
	a VMA policy for the range of the calling task's address space
	specified by the 'start' and 'len' arguments.  Additional actions
	may be requested via the 'flags' argument.

	See the mbind(2) man page for more details.

MEMORY POLICY COMMAND LINE INTERFACE

Although not strictly part of the Linux implementation of memory policy,
a command line tool, numactl(8), exists that allows one to:

+ set the task policy for a specified program via set_mempolicy(2), fork(2) and
  exec(2)

+ set the shared policy for a shared memory segment via mbind(2)

The numactl(8) tool is packages with the run-time version of the library
containing the memory policy system call wrappers.  Some distributions
package the headers and compile-time libraries in a separate development
package.


MEMORY POLICIES AND CPUSETS

Memory policies work within cpusets as described above.  For memory policies
that require a node or set of nodes, the nodes are restricted to the set of
nodes whose memories are allowed by the cpuset constraints.  If the nodemask
specified for the policy contains nodes that are not allowed by the cpuset and
MPOL_F_RELATIVE_NODES is not used, the intersection of the set of nodes
specified for the policy and the set of nodes with memory is used.  If the
result is the empty set, the policy is considered invalid and cannot be
installed.  If MPOL_F_RELATIVE_NODES is used, the policy's nodes are mapped
onto and folded into the task's set of allowed nodes as previously described.

The interaction of memory policies and cpusets can be problematic when tasks
in two cpusets share access to a memory region, such as shared memory segments
created by shmget() of mmap() with the MAP_ANONYMOUS and MAP_SHARED flags, and
any of the tasks install shared policy on the region, only nodes whose
memories are allowed in both cpusets may be used in the policies.  Obtaining
this information requires "stepping outside" the memory policy APIs to use the
cpuset information and requires that one know in what cpusets other task might
be attaching to the shared region.  Furthermore, if the cpusets' allowed
memory sets are disjoint, "local" allocation is the only valid policy.
