set_mempolicy(2) -- Linux man page
int set_mempolicy(int policy, unsigned long *nodemask, unsigned long maxnode)
DESCRIPTIONset_mempolicy sets the NUMA memory policy of the current process to policy A NUMA machine has different memory controllers with different distances to specific CPUs. The memory policy defines in which node memory is allocated for the process. This system call defines the default policy for the process, in addition a per memory range policy can be set using mbind(2). The policy is only applied when a new page is allocated for the process. For anonymous memory this is when the page is first touched by the application.
Available policies are MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED. All policies except MPOL_DEFAULT require to specify the nodes they apply to in the nodemask parameter. nodemask is pointer to a bit field of nodes that contains upto maxnode bits. The bit field size is rounded to the next multiple of sizeof(unsigned long), but the kernel will only use bits upto maxnode.
The MPOL_DEFAULT policy is the default and means to use the underlying process policy (which can be modified with set_mempolicy(2) ). Unless the process policy has been changed this means to allocate memory on the node of the CPU that triggered the allocation. nodemask should be passed as NULL.
The MPOL_BIND policy is a strict policy that restricts memory allocation to the nodes specified in nodemask. There won't be allocations on other nodes.
MPOL_INTERLEAVE interleaves allocations to the nodes specified in nodemask. This optimizes for bandwidth instead of latency. To be effective the memory area should be fairly large, at least 1MB or bigger.
MPOL_PREFERRED sets the preferred node for allocation. The kernel will try to allocate in this node first and fall back to other nodes when the preferred nodes is low on free memory. Only the first node in the nodemask is used. When no node is set in the mask the current node is used for allocation.
There are no flags defined right now. This parameter should be currently always set to 0.
Memory policy is inherited to children.
NOTESProcess policy is not remembered when the page is swapped out.
Applications should consider using the higher level functions in numa(3) instead.
RETURN VALUEset_mempolicy returns -1 when an error occurred, otherwise 0.
SEE ALSOmbind(2), get_mempolicy(2), numactl(8), numa(3)