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 */ |
