aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/uapi/linux/mempolicy.h1
-rw-r--r--mm/mempolicy.c11
2 files changed, 7 insertions, 5 deletions
diff --git a/include/uapi/linux/mempolicy.h b/include/uapi/linux/mempolicy.h
index 3e835c9d847b..d23dca8367cc 100644
--- a/include/uapi/linux/mempolicy.h
+++ b/include/uapi/linux/mempolicy.h
@@ -21,6 +21,7 @@ enum {
21 MPOL_BIND, 21 MPOL_BIND,
22 MPOL_INTERLEAVE, 22 MPOL_INTERLEAVE,
23 MPOL_LOCAL, 23 MPOL_LOCAL,
24 MPOL_NOOP, /* retain existing policy for range */
24 MPOL_MAX, /* always last member of enum */ 25 MPOL_MAX, /* always last member of enum */
25}; 26};
26 27
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 54bd3e5ed776..c21e91477c4f 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -251,10 +251,10 @@ static struct mempolicy *mpol_new(unsigned short mode, unsigned short flags,
251 pr_debug("setting mode %d flags %d nodes[0] %lx\n", 251 pr_debug("setting mode %d flags %d nodes[0] %lx\n",
252 mode, flags, nodes ? nodes_addr(*nodes)[0] : -1); 252 mode, flags, nodes ? nodes_addr(*nodes)[0] : -1);
253 253
254 if (mode == MPOL_DEFAULT) { 254 if (mode == MPOL_DEFAULT || mode == MPOL_NOOP) {
255 if (nodes && !nodes_empty(*nodes)) 255 if (nodes && !nodes_empty(*nodes))
256 return ERR_PTR(-EINVAL); 256 return ERR_PTR(-EINVAL);
257 return NULL; /* simply delete any existing policy */ 257 return NULL;
258 } 258 }
259 VM_BUG_ON(!nodes); 259 VM_BUG_ON(!nodes);
260 260
@@ -1147,7 +1147,7 @@ static long do_mbind(unsigned long start, unsigned long len,
1147 if (start & ~PAGE_MASK) 1147 if (start & ~PAGE_MASK)
1148 return -EINVAL; 1148 return -EINVAL;
1149 1149
1150 if (mode == MPOL_DEFAULT) 1150 if (mode == MPOL_DEFAULT || mode == MPOL_NOOP)
1151 flags &= ~MPOL_MF_STRICT; 1151 flags &= ~MPOL_MF_STRICT;
1152 1152
1153 len = (len + PAGE_SIZE - 1) & PAGE_MASK; 1153 len = (len + PAGE_SIZE - 1) & PAGE_MASK;
@@ -2409,7 +2409,8 @@ static const char * const policy_modes[] =
2409 [MPOL_PREFERRED] = "prefer", 2409 [MPOL_PREFERRED] = "prefer",
2410 [MPOL_BIND] = "bind", 2410 [MPOL_BIND] = "bind",
2411 [MPOL_INTERLEAVE] = "interleave", 2411 [MPOL_INTERLEAVE] = "interleave",
2412 [MPOL_LOCAL] = "local" 2412 [MPOL_LOCAL] = "local",
2413 [MPOL_NOOP] = "noop", /* should not actually be used */
2413}; 2414};
2414 2415
2415 2416
@@ -2460,7 +2461,7 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
2460 break; 2461 break;
2461 } 2462 }
2462 } 2463 }
2463 if (mode >= MPOL_MAX) 2464 if (mode >= MPOL_MAX || mode == MPOL_NOOP)
2464 goto out; 2465 goto out;
2465 2466
2466 switch (mode) { 2467 switch (mode) {