Blame view

include/linux/mempolicy.h 9.69 KB
1da177e4c   Linus Torvalds   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   David Rientjes   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   Linus Torvalds   Linux-2.6.12-rc2
15
  /* Policies */
a3b51e014   David Rientjes   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   Linus Torvalds   Linux-2.6.12-rc2
23

708c1bbc9   Miao Xie   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   David Rientjes   mempolicy: suppor...
30
  /* Flags for set_mempolicy */
f5b087b52   David Rientjes   mempolicy: add MP...
31
  #define MPOL_F_STATIC_NODES	(1 << 15)
4c50bc011   David Rientjes   mempolicy: add MP...
32
  #define MPOL_F_RELATIVE_NODES	(1 << 14)
f5b087b52   David Rientjes   mempolicy: add MP...
33

028fec414   David Rientjes   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   David Rientjes   mempolicy: add MP...
38
  #define MPOL_MODE_FLAGS	(MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES)
028fec414   David Rientjes   mempolicy: suppor...
39
40
  
  /* Flags for get_mempolicy */
1da177e4c   Linus Torvalds   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   Lee Schermerhorn   Mem Policy: add M...
43
  #define MPOL_F_MEMS_ALLOWED (1<<2) /* return allowed memories */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
  
  /* Flags for mbind */
  #define MPOL_MF_STRICT	(1<<0)	/* Verify existing pages in the mapping */
dc9aa5b9d   Christoph Lameter   [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   Linus Torvalds   Linux-2.6.12-rc2
50

aab0b1029   Lee Schermerhorn   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   Lee Schermerhorn   mempolicy: use MP...
57
  #define MPOL_F_LOCAL   (1 << 1)	/* preferred local allocation */
708c1bbc9   Miao Xie   mempolicy: restru...
58
  #define MPOL_F_REBINDING (1 << 2)	/* identify policies in rebinding */
aab0b1029   Lee Schermerhorn   mempolicy: mark s...
59

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  #include <linux/mmzone.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
  #include <linux/slab.h>
  #include <linux/rbtree.h>
  #include <linux/spinlock.h>
dfcd3c0dc   Andi Kleen   [PATCH] Convert m...
65
  #include <linux/nodemask.h>
83d1674a9   Gerald Schaefer   mm: make CONFIG_M...
66
  #include <linux/pagemap.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67

45b35a5ce   Ralf Baechle   [PATCH] Fix mempo...
68
  struct mm_struct;
1da177e4c   Linus Torvalds   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   Hugh Dickins   [PATCH] mm: updat...
83
   * mmap_sem.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
   *
   * Freeing policy:
19770b326   Mel Gorman   mm: filter based ...
86
   * Mempolicy objects are reference counted.  A mempolicy will be freed when
f0be3d32b   Lee Schermerhorn   mempolicy: rename...
87
   * mpol_put() decrements the reference count to zero.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
   *
846a16bf0   Lee Schermerhorn   mempolicy: rename...
89
90
   * Duplicating policy objects:
   * mpol_dup() allocates a new mempolicy and copies the specified mempolicy
19770b326   Mel Gorman   mm: filter based ...
91
   * to the new storage.  The reference count of the new object is initialized
846a16bf0   Lee Schermerhorn   mempolicy: rename...
92
   * to 1, representing the caller of mpol_dup().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
   */
  struct mempolicy {
  	atomic_t refcnt;
45c4745af   Lee Schermerhorn   mempolicy: rename...
96
  	unsigned short mode; 	/* See MPOL_* above */
028fec414   David Rientjes   mempolicy: suppor...
97
  	unsigned short flags;	/* See set_mempolicy() MPOL_F_* above */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  	union {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  		short 		 preferred_node; /* preferred */
19770b326   Mel Gorman   mm: filter based ...
100
  		nodemask_t	 nodes;		/* interleave/bind */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
  		/* undefined for default */
  	} v;
f5b087b52   David Rientjes   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   Linus Torvalds   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   Lee Schermerhorn   mempolicy: rename...
113
114
  extern void __mpol_put(struct mempolicy *pol);
  static inline void mpol_put(struct mempolicy *pol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
  {
  	if (pol)
f0be3d32b   Lee Schermerhorn   mempolicy: rename...
117
  		__mpol_put(pol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  }
52cd3b074   Lee Schermerhorn   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   Lee Schermerhorn   mempolicy: rename...
143
144
  extern struct mempolicy *__mpol_dup(struct mempolicy *pol);
  static inline struct mempolicy *mpol_dup(struct mempolicy *pol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
  {
  	if (pol)
846a16bf0   Lee Schermerhorn   mempolicy: rename...
147
  		pol = __mpol_dup(pol);
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
167

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
  /*
1da177e4c   Linus Torvalds   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   Lee Schermerhorn   mempolicy: use st...
186
  void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
191
192
  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);
d98f6cb67   Stephen Wilson   mm: export get_vm...
193
194
  struct mempolicy *get_vma_policy(struct task_struct *tsk,
  		struct vm_area_struct *vma, unsigned long addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
  extern void numa_default_policy(void);
  extern void numa_policy_init(void);
708c1bbc9   Miao Xie   mempolicy: restru...
197
198
  extern void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new,
  				enum mpol_rebind_step step);
4225399a6   Paul Jackson   [PATCH] cpuset: r...
199
  extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new);
c61afb181   Paul Jackson   [PATCH] cpuset me...
200
  extern void mpol_fix_fork_child_flag(struct task_struct *p);
4225399a6   Paul Jackson   [PATCH] cpuset: r...
201

5da7ca860   Christoph Lameter   [PATCH] Add NUMA ...
202
  extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
19770b326   Mel Gorman   mm: filter based ...
203
204
  				unsigned long addr, gfp_t gfp_flags,
  				struct mempolicy **mpol, nodemask_t **nodemask);
06808b082   Lee Schermerhorn   hugetlb: derive h...
205
  extern bool init_nodemask_of_mempolicy(nodemask_t *mask);
6f48d0ebd   David Rientjes   oom: select task ...
206
207
  extern bool mempolicy_nodemask_intersects(struct task_struct *tsk,
  				const nodemask_t *mask);
dc85da15d   Christoph Lameter   [PATCH] NUMA poli...
208
  extern unsigned slab_node(struct mempolicy *policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209

2f6726e54   Christoph Lameter   [PATCH] Apply typ...
210
  extern enum zone_type policy_zone;
4be38e351   Christoph Lameter   [PATCH] mm: move ...
211

2f6726e54   Christoph Lameter   [PATCH] Apply typ...
212
  static inline void check_highest_zone(enum zone_type k)
4be38e351   Christoph Lameter   [PATCH] mm: move ...
213
  {
b377fd398   Mel Gorman   Apply memory poli...
214
  	if (k > policy_zone && k != ZONE_MOVABLE)
4be38e351   Christoph Lameter   [PATCH] mm: move ...
215
216
  		policy_zone = k;
  }
39743889a   Christoph Lameter   [PATCH] Swap Migr...
217
218
  int do_migrate_pages(struct mm_struct *mm,
  	const nodemask_t *from_nodes, const nodemask_t *to_nodes, int flags);
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
219
220
  
  #ifdef CONFIG_TMPFS
71fe804b6   Lee Schermerhorn   mempolicy: use st...
221
  extern int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context);
13057efb0   Stephen Wilson   mm: declare mpol_...
222
  #endif
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
223

71fe804b6   Lee Schermerhorn   mempolicy: use st...
224
225
  extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
  			int no_context);
83d1674a9   Gerald Schaefer   mm: make CONFIG_M...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
  
  /* 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   Linus Torvalds   Linux-2.6.12-rc2
243
244
245
246
247
248
249
250
  #else
  
  struct mempolicy {};
  
  static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b)
  {
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251

f0be3d32b   Lee Schermerhorn   mempolicy: rename...
252
  static inline void mpol_put(struct mempolicy *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
254
  {
  }
52cd3b074   Lee Schermerhorn   mempolicy: rework...
255
256
257
258
259
260
261
262
263
  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   Linus Torvalds   Linux-2.6.12-rc2
264
265
266
  static inline void mpol_get(struct mempolicy *pol)
  {
  }
846a16bf0   Lee Schermerhorn   mempolicy: rename...
267
  static inline struct mempolicy *mpol_dup(struct mempolicy *old)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
269
270
  {
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
272
273
274
275
276
277
278
  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   Lee Schermerhorn   mempolicy: use st...
279
280
  static inline void mpol_shared_policy_init(struct shared_policy *sp,
  						struct mempolicy *mpol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
  {
  }
  
  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   Paul Jackson   [PATCH] cpuset: n...
304
  static inline void mpol_rebind_task(struct task_struct *tsk,
708c1bbc9   Miao Xie   mempolicy: restru...
305
306
  				const nodemask_t *new,
  				enum mpol_rebind_step step)
68860ec10   Paul Jackson   [PATCH] cpusets: ...
307
308
  {
  }
4225399a6   Paul Jackson   [PATCH] cpuset: r...
309
310
311
  static inline void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)
  {
  }
c61afb181   Paul Jackson   [PATCH] cpuset me...
312
313
314
  static inline void mpol_fix_fork_child_flag(struct task_struct *p)
  {
  }
5da7ca860   Christoph Lameter   [PATCH] Add NUMA ...
315
  static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma,
19770b326   Mel Gorman   mm: filter based ...
316
317
  				unsigned long addr, gfp_t gfp_flags,
  				struct mempolicy **mpol, nodemask_t **nodemask)
5da7ca860   Christoph Lameter   [PATCH] Add NUMA ...
318
  {
19770b326   Mel Gorman   mm: filter based ...
319
320
  	*mpol = NULL;
  	*nodemask = NULL;
0e88460da   Mel Gorman   mm: introduce nod...
321
  	return node_zonelist(0, gfp_flags);
5da7ca860   Christoph Lameter   [PATCH] Add NUMA ...
322
  }
6f48d0ebd   David Rientjes   oom: select task ...
323
324
325
326
327
328
329
330
331
332
  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   Lee Schermerhorn   hugetlb: derive h...
333

45b07ef31   Paul Jackson   [PATCH] cpusets: ...
334
335
336
337
338
339
  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   Christoph Lameter   [PATCH] mm: move ...
340
341
342
  static inline void check_highest_zone(int k)
  {
  }
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
343
344
  
  #ifdef CONFIG_TMPFS
71fe804b6   Lee Schermerhorn   mempolicy: use st...
345
346
  static inline int mpol_parse_str(char *str, struct mempolicy **mpol,
  				int no_context)
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
347
  {
71fe804b6   Lee Schermerhorn   mempolicy: use st...
348
  	return 1;	/* error */
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
349
  }
13057efb0   Stephen Wilson   mm: declare mpol_...
350
  #endif
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
351

71fe804b6   Lee Schermerhorn   mempolicy: use st...
352
353
  static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
  				int no_context)
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
354
355
356
  {
  	return 0;
  }
095f1fc4e   Lee Schermerhorn   mempolicy: rework...
357

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
361
  #endif /* CONFIG_NUMA */
  #endif /* __KERNEL__ */
  
  #endif