diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 643f66e10187..08f40a2f3fe0 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -73,7 +73,6 @@ | |||
73 | #include <linux/sched.h> | 73 | #include <linux/sched.h> |
74 | #include <linux/nodemask.h> | 74 | #include <linux/nodemask.h> |
75 | #include <linux/cpuset.h> | 75 | #include <linux/cpuset.h> |
76 | #include <linux/gfp.h> | ||
77 | #include <linux/slab.h> | 76 | #include <linux/slab.h> |
78 | #include <linux/string.h> | 77 | #include <linux/string.h> |
79 | #include <linux/module.h> | 78 | #include <linux/module.h> |
@@ -806,9 +805,13 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, | |||
806 | 805 | ||
807 | err = 0; | 806 | err = 0; |
808 | if (nmask) { | 807 | if (nmask) { |
809 | task_lock(current); | 808 | if (mpol_store_user_nodemask(pol)) { |
810 | get_policy_nodemask(pol, nmask); | 809 | *nmask = pol->w.user_nodemask; |
811 | task_unlock(current); | 810 | } else { |
811 | task_lock(current); | ||
812 | get_policy_nodemask(pol, nmask); | ||
813 | task_unlock(current); | ||
814 | } | ||
812 | } | 815 | } |
813 | 816 | ||
814 | out: | 817 | out: |
@@ -2195,8 +2198,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
2195 | char *rest = nodelist; | 2198 | char *rest = nodelist; |
2196 | while (isdigit(*rest)) | 2199 | while (isdigit(*rest)) |
2197 | rest++; | 2200 | rest++; |
2198 | if (!*rest) | 2201 | if (*rest) |
2199 | err = 0; | 2202 | goto out; |
2200 | } | 2203 | } |
2201 | break; | 2204 | break; |
2202 | case MPOL_INTERLEAVE: | 2205 | case MPOL_INTERLEAVE: |
@@ -2205,7 +2208,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
2205 | */ | 2208 | */ |
2206 | if (!nodelist) | 2209 | if (!nodelist) |
2207 | nodes = node_states[N_HIGH_MEMORY]; | 2210 | nodes = node_states[N_HIGH_MEMORY]; |
2208 | err = 0; | ||
2209 | break; | 2211 | break; |
2210 | case MPOL_LOCAL: | 2212 | case MPOL_LOCAL: |
2211 | /* | 2213 | /* |
@@ -2215,11 +2217,19 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
2215 | goto out; | 2217 | goto out; |
2216 | mode = MPOL_PREFERRED; | 2218 | mode = MPOL_PREFERRED; |
2217 | break; | 2219 | break; |
2218 | 2220 | case MPOL_DEFAULT: | |
2219 | /* | 2221 | /* |
2220 | * case MPOL_BIND: mpol_new() enforces non-empty nodemask. | 2222 | * Insist on a empty nodelist |
2221 | * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags. | 2223 | */ |
2222 | */ | 2224 | if (!nodelist) |
2225 | err = 0; | ||
2226 | goto out; | ||
2227 | case MPOL_BIND: | ||
2228 | /* | ||
2229 | * Insist on a nodelist | ||
2230 | */ | ||
2231 | if (!nodelist) | ||
2232 | goto out; | ||
2223 | } | 2233 | } |
2224 | 2234 | ||
2225 | mode_flags = 0; | 2235 | mode_flags = 0; |
@@ -2233,13 +2243,14 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
2233 | else if (!strcmp(flags, "relative")) | 2243 | else if (!strcmp(flags, "relative")) |
2234 | mode_flags |= MPOL_F_RELATIVE_NODES; | 2244 | mode_flags |= MPOL_F_RELATIVE_NODES; |
2235 | else | 2245 | else |
2236 | err = 1; | 2246 | goto out; |
2237 | } | 2247 | } |
2238 | 2248 | ||
2239 | new = mpol_new(mode, mode_flags, &nodes); | 2249 | new = mpol_new(mode, mode_flags, &nodes); |
2240 | if (IS_ERR(new)) | 2250 | if (IS_ERR(new)) |
2241 | err = 1; | 2251 | goto out; |
2242 | else { | 2252 | |
2253 | { | ||
2243 | int ret; | 2254 | int ret; |
2244 | NODEMASK_SCRATCH(scratch); | 2255 | NODEMASK_SCRATCH(scratch); |
2245 | if (scratch) { | 2256 | if (scratch) { |
@@ -2250,13 +2261,15 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
2250 | ret = -ENOMEM; | 2261 | ret = -ENOMEM; |
2251 | NODEMASK_SCRATCH_FREE(scratch); | 2262 | NODEMASK_SCRATCH_FREE(scratch); |
2252 | if (ret) { | 2263 | if (ret) { |
2253 | err = 1; | ||
2254 | mpol_put(new); | 2264 | mpol_put(new); |
2255 | } else if (no_context) { | 2265 | goto out; |
2256 | /* save for contextualization */ | ||
2257 | new->w.user_nodemask = nodes; | ||
2258 | } | 2266 | } |
2259 | } | 2267 | } |
2268 | err = 0; | ||
2269 | if (no_context) { | ||
2270 | /* save for contextualization */ | ||
2271 | new->w.user_nodemask = nodes; | ||
2272 | } | ||
2260 | 2273 | ||
2261 | out: | 2274 | out: |
2262 | /* Restore string for error message */ | 2275 | /* Restore string for error message */ |