Blame view
include/linux/mempolicy.h
9.58 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 |
#ifndef _LINUX_MEMPOLICY_H #define _LINUX_MEMPOLICY_H 1 #include <linux/errno.h> /* * NUMA memory policies for Linux. * Copyright 2003,2004 Andi Kleen SuSE Labs */ |
028fec414 mempolicy: suppor... |
10 11 12 13 14 |
/* * Both the MPOL_* mempolicy mode and the MPOL_F_* optional mode flags are * passed by the user to either set_mempolicy() or mbind() in an 'int' actual. * The MPOL_MODE_FLAGS macro determines the legal set of optional mode flags. */ |
1da177e4c Linux-2.6.12-rc2 |
15 |
/* Policies */ |
a3b51e014 mempolicy: conver... |
16 17 18 19 20 21 22 |
enum { MPOL_DEFAULT, MPOL_PREFERRED, MPOL_BIND, MPOL_INTERLEAVE, MPOL_MAX, /* always last member of enum */ }; |
1da177e4c Linux-2.6.12-rc2 |
23 |
|
708c1bbc9 mempolicy: restru... |
24 25 26 27 28 29 |
enum mpol_rebind_step { MPOL_REBIND_ONCE, /* do rebind work at once(not by two step) */ MPOL_REBIND_STEP1, /* first step(set all the newly nodes) */ MPOL_REBIND_STEP2, /* second step(clean all the disallowed nodes)*/ MPOL_REBIND_NSTEP, }; |
028fec414 mempolicy: suppor... |
30 |
/* Flags for set_mempolicy */ |
f5b087b52 mempolicy: add MP... |
31 |
#define MPOL_F_STATIC_NODES (1 << 15) |
4c50bc011 mempolicy: add MP... |
32 |
#define MPOL_F_RELATIVE_NODES (1 << 14) |
f5b087b52 mempolicy: add MP... |
33 |
|
028fec414 mempolicy: suppor... |
34 35 36 37 |
/* * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to * either set_mempolicy() or mbind(). */ |
4c50bc011 mempolicy: add MP... |
38 |
#define MPOL_MODE_FLAGS (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES) |
028fec414 mempolicy: suppor... |
39 40 |
/* Flags for get_mempolicy */ |
1da177e4c Linux-2.6.12-rc2 |
41 42 |
#define MPOL_F_NODE (1<<0) /* return next IL mode instead of node mask */ #define MPOL_F_ADDR (1<<1) /* look up vma using address */ |
754af6f5a Mem Policy: add M... |
43 |
#define MPOL_F_MEMS_ALLOWED (1<<2) /* return allowed memories */ |
1da177e4c Linux-2.6.12-rc2 |
44 45 46 |
/* Flags for mbind */ #define MPOL_MF_STRICT (1<<0) /* Verify existing pages in the mapping */ |
dc9aa5b9d [PATCH] Swap Migr... |
47 48 49 |
#define MPOL_MF_MOVE (1<<1) /* Move pages owned by this process to conform to mapping */ #define MPOL_MF_MOVE_ALL (1<<2) /* Move every page to conform to mapping */ #define MPOL_MF_INTERNAL (1<<3) /* Internal flags start here */ |
1da177e4c Linux-2.6.12-rc2 |
50 |
|
aab0b1029 mempolicy: mark s... |
51 52 53 54 55 56 |
/* * Internal flags that share the struct mempolicy flags word with * "mode flags". These flags are allocated from bit 0 up, as they * are never OR'ed into the mode in mempolicy API arguments. */ #define MPOL_F_SHARED (1 << 0) /* identify shared policies */ |
fc36b8d3d mempolicy: use MP... |
57 |
#define MPOL_F_LOCAL (1 << 1) /* preferred local allocation */ |
708c1bbc9 mempolicy: restru... |
58 |
#define MPOL_F_REBINDING (1 << 2) /* identify policies in rebinding */ |
aab0b1029 mempolicy: mark s... |
59 |
|
1da177e4c Linux-2.6.12-rc2 |
60 |
#ifdef __KERNEL__ |
1da177e4c Linux-2.6.12-rc2 |
61 |
#include <linux/mmzone.h> |
1da177e4c Linux-2.6.12-rc2 |
62 63 64 |
#include <linux/slab.h> #include <linux/rbtree.h> #include <linux/spinlock.h> |
dfcd3c0dc [PATCH] Convert m... |
65 |
#include <linux/nodemask.h> |
83d1674a9 mm: make CONFIG_M... |
66 |
#include <linux/pagemap.h> |
1da177e4c Linux-2.6.12-rc2 |
67 |
|
45b35a5ce [PATCH] Fix mempo... |
68 |
struct mm_struct; |
1da177e4c Linux-2.6.12-rc2 |
69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#ifdef CONFIG_NUMA /* * Describe a memory policy. * * A mempolicy can be either associated with a process or with a VMA. * For VMA related allocations the VMA policy is preferred, otherwise * the process policy is used. Interrupts ignore the memory policy * of the current process. * * Locking policy for interlave: * In process context there is no locking because only the process accesses * its own state. All vma manipulation is somewhat protected by a down_read on |
b8072f099 [PATCH] mm: updat... |
83 |
* mmap_sem. |
1da177e4c Linux-2.6.12-rc2 |
84 85 |
* * Freeing policy: |
19770b326 mm: filter based ... |
86 |
* Mempolicy objects are reference counted. A mempolicy will be freed when |
f0be3d32b mempolicy: rename... |
87 |
* mpol_put() decrements the reference count to zero. |
1da177e4c Linux-2.6.12-rc2 |
88 |
* |
846a16bf0 mempolicy: rename... |
89 90 |
* Duplicating policy objects: * mpol_dup() allocates a new mempolicy and copies the specified mempolicy |
19770b326 mm: filter based ... |
91 |
* to the new storage. The reference count of the new object is initialized |
846a16bf0 mempolicy: rename... |
92 |
* to 1, representing the caller of mpol_dup(). |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 |
*/ struct mempolicy { atomic_t refcnt; |
45c4745af mempolicy: rename... |
96 |
unsigned short mode; /* See MPOL_* above */ |
028fec414 mempolicy: suppor... |
97 |
unsigned short flags; /* See set_mempolicy() MPOL_F_* above */ |
1da177e4c Linux-2.6.12-rc2 |
98 |
union { |
1da177e4c Linux-2.6.12-rc2 |
99 |
short preferred_node; /* preferred */ |
19770b326 mm: filter based ... |
100 |
nodemask_t nodes; /* interleave/bind */ |
1da177e4c Linux-2.6.12-rc2 |
101 102 |
/* undefined for default */ } v; |
f5b087b52 mempolicy: add MP... |
103 104 105 106 |
union { nodemask_t cpuset_mems_allowed; /* relative to these nodes */ nodemask_t user_nodemask; /* nodemask passed by user */ } w; |
1da177e4c Linux-2.6.12-rc2 |
107 108 109 110 111 112 |
}; /* * Support for managing mempolicy data objects (clone, copy, destroy) * The default fast path of a NULL MPOL_DEFAULT policy is always inlined. */ |
f0be3d32b mempolicy: rename... |
113 114 |
extern void __mpol_put(struct mempolicy *pol); static inline void mpol_put(struct mempolicy *pol) |
1da177e4c Linux-2.6.12-rc2 |
115 116 |
{ if (pol) |
f0be3d32b mempolicy: rename... |
117 |
__mpol_put(pol); |
1da177e4c Linux-2.6.12-rc2 |
118 |
} |
52cd3b074 mempolicy: rework... |
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
/* * Does mempolicy pol need explicit unref after use? * Currently only needed for shared policies. */ static inline int mpol_needs_cond_ref(struct mempolicy *pol) { return (pol && (pol->flags & MPOL_F_SHARED)); } static inline void mpol_cond_put(struct mempolicy *pol) { if (mpol_needs_cond_ref(pol)) __mpol_put(pol); } extern struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, struct mempolicy *frompol); static inline struct mempolicy *mpol_cond_copy(struct mempolicy *tompol, struct mempolicy *frompol) { if (!frompol) return frompol; return __mpol_cond_copy(tompol, frompol); } |
846a16bf0 mempolicy: rename... |
143 144 |
extern struct mempolicy *__mpol_dup(struct mempolicy *pol); static inline struct mempolicy *mpol_dup(struct mempolicy *pol) |
1da177e4c Linux-2.6.12-rc2 |
145 146 |
{ if (pol) |
846a16bf0 mempolicy: rename... |
147 |
pol = __mpol_dup(pol); |
1da177e4c Linux-2.6.12-rc2 |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
return pol; } #define vma_policy(vma) ((vma)->vm_policy) #define vma_set_policy(vma, pol) ((vma)->vm_policy = (pol)) static inline void mpol_get(struct mempolicy *pol) { if (pol) atomic_inc(&pol->refcnt); } extern int __mpol_equal(struct mempolicy *a, struct mempolicy *b); static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b) { if (a == b) return 1; return __mpol_equal(a, b); } |
1da177e4c Linux-2.6.12-rc2 |
167 |
|
1da177e4c Linux-2.6.12-rc2 |
168 |
/* |
1da177e4c Linux-2.6.12-rc2 |
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
* Tree of shared policies for a shared memory region. * Maintain the policies in a pseudo mm that contains vmas. The vmas * carry the policy. As a special twist the pseudo mm is indexed in pages, not * bytes, so that we can work with shared memory segments bigger than * unsigned long. */ struct sp_node { struct rb_node nd; unsigned long start, end; struct mempolicy *policy; }; struct shared_policy { struct rb_root root; spinlock_t lock; }; |
71fe804b6 mempolicy: use st... |
186 |
void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol); |
1da177e4c Linux-2.6.12-rc2 |
187 188 189 190 191 192 193 194 195 |
int mpol_set_shared_policy(struct shared_policy *info, struct vm_area_struct *vma, struct mempolicy *new); void mpol_free_shared_policy(struct shared_policy *p); struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx); extern void numa_default_policy(void); extern void numa_policy_init(void); |
708c1bbc9 mempolicy: restru... |
196 197 |
extern void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new, enum mpol_rebind_step step); |
4225399a6 [PATCH] cpuset: r... |
198 |
extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new); |
c61afb181 [PATCH] cpuset me... |
199 |
extern void mpol_fix_fork_child_flag(struct task_struct *p); |
4225399a6 [PATCH] cpuset: r... |
200 |
|
5da7ca860 [PATCH] Add NUMA ... |
201 |
extern struct zonelist *huge_zonelist(struct vm_area_struct *vma, |
19770b326 mm: filter based ... |
202 203 |
unsigned long addr, gfp_t gfp_flags, struct mempolicy **mpol, nodemask_t **nodemask); |
06808b082 hugetlb: derive h... |
204 |
extern bool init_nodemask_of_mempolicy(nodemask_t *mask); |
6f48d0ebd oom: select task ... |
205 206 |
extern bool mempolicy_nodemask_intersects(struct task_struct *tsk, const nodemask_t *mask); |
dc85da15d [PATCH] NUMA poli... |
207 |
extern unsigned slab_node(struct mempolicy *policy); |
1da177e4c Linux-2.6.12-rc2 |
208 |
|
2f6726e54 [PATCH] Apply typ... |
209 |
extern enum zone_type policy_zone; |
4be38e351 [PATCH] mm: move ... |
210 |
|
2f6726e54 [PATCH] Apply typ... |
211 |
static inline void check_highest_zone(enum zone_type k) |
4be38e351 [PATCH] mm: move ... |
212 |
{ |
b377fd398 Apply memory poli... |
213 |
if (k > policy_zone && k != ZONE_MOVABLE) |
4be38e351 [PATCH] mm: move ... |
214 215 |
policy_zone = k; } |
39743889a [PATCH] Swap Migr... |
216 217 |
int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from_nodes, const nodemask_t *to_nodes, int flags); |
095f1fc4e mempolicy: rework... |
218 219 |
#ifdef CONFIG_TMPFS |
71fe804b6 mempolicy: use st... |
220 |
extern int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context); |
095f1fc4e mempolicy: rework... |
221 |
|
71fe804b6 mempolicy: use st... |
222 223 |
extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context); |
095f1fc4e mempolicy: rework... |
224 |
#endif |
83d1674a9 mm: make CONFIG_M... |
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
/* Check if a vma is migratable */ static inline int vma_migratable(struct vm_area_struct *vma) { if (vma->vm_flags & (VM_IO|VM_HUGETLB|VM_PFNMAP|VM_RESERVED)) return 0; /* * Migration allocates pages in the highest zone. If we cannot * do so then migration (at least from node to node) is not * possible. */ if (vma->vm_file && gfp_zone(mapping_gfp_mask(vma->vm_file->f_mapping)) < policy_zone) return 0; return 1; } |
1da177e4c Linux-2.6.12-rc2 |
242 243 244 245 246 247 248 249 |
#else struct mempolicy {}; static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b) { return 1; } |
1da177e4c Linux-2.6.12-rc2 |
250 |
|
f0be3d32b mempolicy: rename... |
251 |
static inline void mpol_put(struct mempolicy *p) |
1da177e4c Linux-2.6.12-rc2 |
252 253 |
{ } |
52cd3b074 mempolicy: rework... |
254 255 256 257 258 259 260 261 262 |
static inline void mpol_cond_put(struct mempolicy *pol) { } static inline struct mempolicy *mpol_cond_copy(struct mempolicy *to, struct mempolicy *from) { return from; } |
1da177e4c Linux-2.6.12-rc2 |
263 264 265 |
static inline void mpol_get(struct mempolicy *pol) { } |
846a16bf0 mempolicy: rename... |
266 |
static inline struct mempolicy *mpol_dup(struct mempolicy *old) |
1da177e4c Linux-2.6.12-rc2 |
267 268 269 |
{ return NULL; } |
1da177e4c Linux-2.6.12-rc2 |
270 271 272 273 274 275 276 277 |
struct shared_policy {}; static inline int mpol_set_shared_policy(struct shared_policy *info, struct vm_area_struct *vma, struct mempolicy *new) { return -EINVAL; } |
71fe804b6 mempolicy: use st... |
278 279 |
static inline void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) |
1da177e4c Linux-2.6.12-rc2 |
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
{ } static inline void mpol_free_shared_policy(struct shared_policy *p) { } static inline struct mempolicy * mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx) { return NULL; } #define vma_policy(vma) NULL #define vma_set_policy(vma, pol) do {} while(0) static inline void numa_policy_init(void) { } static inline void numa_default_policy(void) { } |
74cb21553 [PATCH] cpuset: n... |
303 |
static inline void mpol_rebind_task(struct task_struct *tsk, |
708c1bbc9 mempolicy: restru... |
304 305 |
const nodemask_t *new, enum mpol_rebind_step step) |
68860ec10 [PATCH] cpusets: ... |
306 307 |
{ } |
4225399a6 [PATCH] cpuset: r... |
308 309 310 |
static inline void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new) { } |
c61afb181 [PATCH] cpuset me... |
311 312 313 |
static inline void mpol_fix_fork_child_flag(struct task_struct *p) { } |
5da7ca860 [PATCH] Add NUMA ... |
314 |
static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma, |
19770b326 mm: filter based ... |
315 316 |
unsigned long addr, gfp_t gfp_flags, struct mempolicy **mpol, nodemask_t **nodemask) |
5da7ca860 [PATCH] Add NUMA ... |
317 |
{ |
19770b326 mm: filter based ... |
318 319 |
*mpol = NULL; *nodemask = NULL; |
0e88460da mm: introduce nod... |
320 |
return node_zonelist(0, gfp_flags); |
5da7ca860 [PATCH] Add NUMA ... |
321 |
} |
6f48d0ebd oom: select task ... |
322 323 324 325 326 327 328 329 330 331 |
static inline bool init_nodemask_of_mempolicy(nodemask_t *m) { return false; } static inline bool mempolicy_nodemask_intersects(struct task_struct *tsk, const nodemask_t *mask) { return false; } |
06808b082 hugetlb: derive h... |
332 |
|
45b07ef31 [PATCH] cpusets: ... |
333 334 335 336 337 338 |
static inline int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from_nodes, const nodemask_t *to_nodes, int flags) { return 0; } |
4be38e351 [PATCH] mm: move ... |
339 340 341 |
static inline void check_highest_zone(int k) { } |
095f1fc4e mempolicy: rework... |
342 343 |
#ifdef CONFIG_TMPFS |
71fe804b6 mempolicy: use st... |
344 345 |
static inline int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
095f1fc4e mempolicy: rework... |
346 |
{ |
71fe804b6 mempolicy: use st... |
347 |
return 1; /* error */ |
095f1fc4e mempolicy: rework... |
348 |
} |
71fe804b6 mempolicy: use st... |
349 350 |
static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) |
095f1fc4e mempolicy: rework... |
351 352 353 354 |
{ return 0; } #endif |
1da177e4c Linux-2.6.12-rc2 |
355 356 357 358 |
#endif /* CONFIG_NUMA */ #endif /* __KERNEL__ */ #endif |