diff options
author | KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> | 2010-08-09 20:19:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-09 23:44:58 -0400 |
commit | 596d7cfa2be6284512915609f01b7fe2f4df5d02 (patch) | |
tree | 7acfea30efdce5fb17da4302e567059bcae915eb | |
parent | 251060006003b79b788f8ce5a827ee5354a42910 (diff) |
mempolicy: reduce stack size of migrate_pages()
migrate_pages() is using >500 bytes stack. Reduce it.
mm/mempolicy.c: In function 'sys_migrate_pages':
mm/mempolicy.c:1344: warning: the frame size of 528 bytes is larger than 512 bytes
[akpm@linux-foundation.org: don't play with a might-be-NULL pointer]
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Christoph Lameter <cl@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/mempolicy.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 8a73708d59bb..f969da5dd8a2 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -1275,33 +1275,42 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, | |||
1275 | const unsigned long __user *, new_nodes) | 1275 | const unsigned long __user *, new_nodes) |
1276 | { | 1276 | { |
1277 | const struct cred *cred = current_cred(), *tcred; | 1277 | const struct cred *cred = current_cred(), *tcred; |
1278 | struct mm_struct *mm; | 1278 | struct mm_struct *mm = NULL; |
1279 | struct task_struct *task; | 1279 | struct task_struct *task; |
1280 | nodemask_t old; | ||
1281 | nodemask_t new; | ||
1282 | nodemask_t task_nodes; | 1280 | nodemask_t task_nodes; |
1283 | int err; | 1281 | int err; |
1282 | nodemask_t *old; | ||
1283 | nodemask_t *new; | ||
1284 | NODEMASK_SCRATCH(scratch); | ||
1285 | |||
1286 | if (!scratch) | ||
1287 | return -ENOMEM; | ||
1284 | 1288 | ||
1285 | err = get_nodes(&old, old_nodes, maxnode); | 1289 | old = &scratch->mask1; |
1290 | new = &scratch->mask2; | ||
1291 | |||
1292 | err = get_nodes(old, old_nodes, maxnode); | ||
1286 | if (err) | 1293 | if (err) |
1287 | return err; | 1294 | goto out; |
1288 | 1295 | ||
1289 | err = get_nodes(&new, new_nodes, maxnode); | 1296 | err = get_nodes(new, new_nodes, maxnode); |
1290 | if (err) | 1297 | if (err) |
1291 | return err; | 1298 | goto out; |
1292 | 1299 | ||
1293 | /* Find the mm_struct */ | 1300 | /* Find the mm_struct */ |
1294 | read_lock(&tasklist_lock); | 1301 | read_lock(&tasklist_lock); |
1295 | task = pid ? find_task_by_vpid(pid) : current; | 1302 | task = pid ? find_task_by_vpid(pid) : current; |
1296 | if (!task) { | 1303 | if (!task) { |
1297 | read_unlock(&tasklist_lock); | 1304 | read_unlock(&tasklist_lock); |
1298 | return -ESRCH; | 1305 | err = -ESRCH; |
1306 | goto out; | ||
1299 | } | 1307 | } |
1300 | mm = get_task_mm(task); | 1308 | mm = get_task_mm(task); |
1301 | read_unlock(&tasklist_lock); | 1309 | read_unlock(&tasklist_lock); |
1302 | 1310 | ||
1311 | err = -EINVAL; | ||
1303 | if (!mm) | 1312 | if (!mm) |
1304 | return -EINVAL; | 1313 | goto out; |
1305 | 1314 | ||
1306 | /* | 1315 | /* |
1307 | * Check if this process has the right to modify the specified | 1316 | * Check if this process has the right to modify the specified |
@@ -1322,12 +1331,12 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, | |||
1322 | 1331 | ||
1323 | task_nodes = cpuset_mems_allowed(task); | 1332 | task_nodes = cpuset_mems_allowed(task); |
1324 | /* Is the user allowed to access the target nodes? */ | 1333 | /* Is the user allowed to access the target nodes? */ |
1325 | if (!nodes_subset(new, task_nodes) && !capable(CAP_SYS_NICE)) { | 1334 | if (!nodes_subset(*new, task_nodes) && !capable(CAP_SYS_NICE)) { |
1326 | err = -EPERM; | 1335 | err = -EPERM; |
1327 | goto out; | 1336 | goto out; |
1328 | } | 1337 | } |
1329 | 1338 | ||
1330 | if (!nodes_subset(new, node_states[N_HIGH_MEMORY])) { | 1339 | if (!nodes_subset(*new, node_states[N_HIGH_MEMORY])) { |
1331 | err = -EINVAL; | 1340 | err = -EINVAL; |
1332 | goto out; | 1341 | goto out; |
1333 | } | 1342 | } |
@@ -1336,10 +1345,13 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, | |||
1336 | if (err) | 1345 | if (err) |
1337 | goto out; | 1346 | goto out; |
1338 | 1347 | ||
1339 | err = do_migrate_pages(mm, &old, &new, | 1348 | err = do_migrate_pages(mm, old, new, |
1340 | capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE); | 1349 | capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE); |
1341 | out: | 1350 | out: |
1342 | mmput(mm); | 1351 | if (mm) |
1352 | mmput(mm); | ||
1353 | NODEMASK_SCRATCH_FREE(scratch); | ||
1354 | |||
1343 | return err; | 1355 | return err; |
1344 | } | 1356 | } |
1345 | 1357 | ||