aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/mempolicy.h
diff options
context:
space:
mode:
authorDavid Rientjes <rientjes@google.com>2008-04-28 05:12:27 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 11:58:19 -0400
commitf5b087b52f1710eb0bf15a2d2b030c51a6a1ca9e (patch)
tree66336235822f59215707dfa501e1d2b66b38a015 /include/linux/mempolicy.h
parent028fec414d803117eb4b2ed12acb4dd5da65b32d (diff)
mempolicy: add MPOL_F_STATIC_NODES flag
Add an optional mempolicy mode flag, MPOL_F_STATIC_NODES, that suppresses the node remap when the policy is rebound. Adds another member to struct mempolicy, nodemask_t user_nodemask, as part of a union with cpuset_mems_allowed: struct mempolicy { ... union { nodemask_t cpuset_mems_allowed; nodemask_t user_nodemask; } w; } that stores the the nodemask that the user passed when he or she created the mempolicy via set_mempolicy() or mbind(). When using MPOL_F_STATIC_NODES, which is passed with any mempolicy mode, the user's passed nodemask intersected with the VMA or task's allowed nodes is always used when determining the preferred node, setting the MPOL_BIND zonelist, or creating the interleave nodemask. This happens whenever the policy is rebound, including when a task's cpuset assignment changes or the cpuset's mems are changed. This creates an interesting side-effect in that it allows the mempolicy "intent" to lie dormant and uneffected until it has access to the node(s) that it desires. For example, if you currently ask for an interleaved policy over a set of nodes that you do not have access to, the mempolicy is not created and the task continues to use the previous policy. With this change, however, it is possible to create the same mempolicy; it is only effected when access to nodes in the nodemask is acquired. It is also possible to mount tmpfs with the static nodemask behavior when specifying a node or nodemask. To do this, simply add "=static" immediately following the mempolicy mode at mount time: mount -o remount mpol=interleave=static:1-3 Also removes mpol_check_policy() and folds its logic into mpol_new() since it is now obsoleted. The unused vma_mpol_equal() is also removed. Cc: Paul Jackson <pj@sgi.com> Cc: Christoph Lameter <clameter@sgi.com> Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com> Cc: Andi Kleen <ak@suse.de> Signed-off-by: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/mempolicy.h')
-rw-r--r--include/linux/mempolicy.h11
1 files changed, 7 insertions, 4 deletions
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h
index f2bab4d2fc40..07350d7b8d96 100644
--- a/include/linux/mempolicy.h
+++ b/include/linux/mempolicy.h
@@ -24,11 +24,13 @@ enum {
24}; 24};
25 25
26/* Flags for set_mempolicy */ 26/* Flags for set_mempolicy */
27#define MPOL_F_STATIC_NODES (1 << 15)
28
27/* 29/*
28 * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to 30 * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to
29 * either set_mempolicy() or mbind(). 31 * either set_mempolicy() or mbind().
30 */ 32 */
31#define MPOL_MODE_FLAGS (0) 33#define MPOL_MODE_FLAGS (MPOL_F_STATIC_NODES)
32 34
33/* Flags for get_mempolicy */ 35/* Flags for get_mempolicy */
34#define MPOL_F_NODE (1<<0) /* return next IL mode instead of node mask */ 36#define MPOL_F_NODE (1<<0) /* return next IL mode instead of node mask */
@@ -85,7 +87,10 @@ struct mempolicy {
85 nodemask_t nodes; /* interleave/bind */ 87 nodemask_t nodes; /* interleave/bind */
86 /* undefined for default */ 88 /* undefined for default */
87 } v; 89 } v;
88 nodemask_t cpuset_mems_allowed; /* mempolicy relative to these nodes */ 90 union {
91 nodemask_t cpuset_mems_allowed; /* relative to these nodes */
92 nodemask_t user_nodemask; /* nodemask passed by user */
93 } w;
89}; 94};
90 95
91/* 96/*
@@ -124,7 +129,6 @@ static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b)
124 return 1; 129 return 1;
125 return __mpol_equal(a, b); 130 return __mpol_equal(a, b);
126} 131}
127#define vma_mpol_equal(a,b) mpol_equal(vma_policy(a), vma_policy(b))
128 132
129/* Could later add inheritance of the process policy here. */ 133/* Could later add inheritance of the process policy here. */
130 134
@@ -190,7 +194,6 @@ static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b)
190{ 194{
191 return 1; 195 return 1;
192} 196}
193#define vma_mpol_equal(a,b) 1
194 197
195#define mpol_set_vma_default(vma) do {} while(0) 198#define mpol_set_vma_default(vma) do {} while(0)
196 199