| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| 2 | /* |
| 3 | * NUMA memory policies for Linux. |
| 4 | * Copyright 2003,2004 Andi Kleen SuSE Labs |
| 5 | */ |
| 6 | #ifndef _LINUX_MEMPOLICY_H |
| 7 | #define _LINUX_MEMPOLICY_H |
| 8 | |
| 9 | #include <linux/errno.h> |
| 10 | |
| 11 | |
| 12 | /* |
| 13 | * Both the MPOL_* mempolicy mode and the MPOL_F_* optional mode flags are |
| 14 | * passed by the user to either set_mempolicy() or mbind() in an 'int' actual. |
| 15 | * The MPOL_MODE_FLAGS macro determines the legal set of optional mode flags. |
| 16 | */ |
| 17 | |
| 18 | /* Policies */ |
| 19 | enum { |
| 20 | 	MPOL_DEFAULT, |
| 21 | 	MPOL_PREFERRED, |
| 22 | 	MPOL_BIND, |
| 23 | 	MPOL_INTERLEAVE, |
| 24 | 	MPOL_LOCAL, |
| 25 | 	MPOL_PREFERRED_MANY, |
| 26 | 	MPOL_WEIGHTED_INTERLEAVE, |
| 27 | 	MPOL_MAX,	/* always last member of enum */ |
| 28 | }; |
| 29 | |
| 30 | /* Flags for set_mempolicy */ |
| 31 | #define MPOL_F_STATIC_NODES	(1 << 15) |
| 32 | #define MPOL_F_RELATIVE_NODES	(1 << 14) |
| 33 | #define MPOL_F_NUMA_BALANCING	(1 << 13) /* Optimize with NUMA balancing if possible */ |
| 34 | |
| 35 | /* |
| 36 | * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to |
| 37 | * either set_mempolicy() or mbind(). |
| 38 | */ |
| 39 | #define MPOL_MODE_FLAGS							\ |
| 40 | 	(MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES | MPOL_F_NUMA_BALANCING) |
| 41 | |
| 42 | /* Whether the nodemask is specified by users */ |
| 43 | #define MPOL_USER_NODEMASK_FLAGS (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES) |
| 44 | |
| 45 | /* Flags for get_mempolicy */ |
| 46 | #define MPOL_F_NODE	(1<<0)	/* return next IL mode instead of node mask */ |
| 47 | #define MPOL_F_ADDR	(1<<1)	/* look up vma using address */ |
| 48 | #define MPOL_F_MEMS_ALLOWED (1<<2) /* return allowed memories */ |
| 49 | |
| 50 | /* Flags for mbind */ |
| 51 | #define MPOL_MF_STRICT	(1<<0)	/* Verify existing pages in the mapping */ |
| 52 | #define MPOL_MF_MOVE	 (1<<1)	/* Move pages owned by this process to conform |
| 53 | 				 to policy */ |
| 54 | #define MPOL_MF_MOVE_ALL (1<<2)	/* Move every page to conform to policy */ |
| 55 | #define MPOL_MF_LAZY	 (1<<3)	/* UNSUPPORTED FLAG: Lazy migrate on fault */ |
| 56 | #define MPOL_MF_INTERNAL (1<<4)	/* Internal flags start here */ |
| 57 | |
| 58 | #define MPOL_MF_VALID	(MPOL_MF_STRICT | 	\ |
| 59 | 			 MPOL_MF_MOVE | 	\ |
| 60 | 			 MPOL_MF_MOVE_ALL) |
| 61 | |
| 62 | /* |
| 63 | * Internal flags that share the struct mempolicy flags word with |
| 64 | * "mode flags". These flags are allocated from bit 0 up, as they |
| 65 | * are never OR'ed into the mode in mempolicy API arguments. |
| 66 | */ |
| 67 | #define MPOL_F_SHARED (1 << 0)	/* identify shared policies */ |
| 68 | #define MPOL_F_MOF	(1 << 3) /* this policy wants migrate on fault */ |
| 69 | #define MPOL_F_MORON	(1 << 4) /* Migrate On protnone Reference On Node */ |
| 70 | |
| 71 | /* |
| 72 | * Enabling zone reclaim means the page allocator will attempt to fulfill |
| 73 | * the allocation request on the current node by triggering reclaim and |
| 74 | * trying to shrink the current node. |
| 75 | * Fallback allocations on the next candidates in the zonelist are considered |
| 76 | * when reclaim fails to free up enough memory in the current node/zone. |
| 77 | * |
| 78 | * These bit locations are exposed in the vm.zone_reclaim_mode sysctl. |
| 79 | * New bits are OK, but existing bits should not be changed. |
| 80 | */ |
| 81 | #define RECLAIM_ZONE	(1<<0)	/* Enable zone reclaim */ |
| 82 | #define RECLAIM_WRITE	(1<<1)	/* Writeout pages during reclaim */ |
| 83 | #define RECLAIM_UNMAP	(1<<2)	/* Unmap pages during reclaim */ |
| 84 | |
| 85 | #endif /* _LINUX_MEMPOLICY_H */ |