diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-11-24 11:05:11 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-24 11:51:45 -0500 |
commit | f17c860760927c2a8e41a021eab3317e4415e962 (patch) | |
tree | 6b414506bd3822f0b3475d454a10f16025a5415c /kernel/sched.c | |
parent | a0e902452da16b79d7c9230630ed8a595d14fa85 (diff) |
sched: convert sys_sched_getaffinity() to cpumask_var_t.
Impact: stack usage reduction
Dynamically allocating cpumasks (when CONFIG_CPUMASK_OFFSTACK) saves
space in the stack. cpumask_var_t is just a struct cpumask for
!CONFIG_CPUMASK_OFFSTACK.
Some jiggling here to make sure we always exit at the bottom (so we hit
the free_cpumask_var there).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 67383e7f1ccd..6deff24349b6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -5499,19 +5499,24 @@ asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, | |||
5499 | unsigned long __user *user_mask_ptr) | 5499 | unsigned long __user *user_mask_ptr) |
5500 | { | 5500 | { |
5501 | int ret; | 5501 | int ret; |
5502 | cpumask_t mask; | 5502 | cpumask_var_t mask; |
5503 | 5503 | ||
5504 | if (len < sizeof(cpumask_t)) | 5504 | if (len < cpumask_size()) |
5505 | return -EINVAL; | 5505 | return -EINVAL; |
5506 | 5506 | ||
5507 | ret = sched_getaffinity(pid, &mask); | 5507 | if (!alloc_cpumask_var(&mask, GFP_KERNEL)) |
5508 | if (ret < 0) | 5508 | return -ENOMEM; |
5509 | return ret; | ||
5510 | 5509 | ||
5511 | if (copy_to_user(user_mask_ptr, &mask, sizeof(cpumask_t))) | 5510 | ret = sched_getaffinity(pid, mask); |
5512 | return -EFAULT; | 5511 | if (ret == 0) { |
5512 | if (copy_to_user(user_mask_ptr, mask, cpumask_size())) | ||
5513 | ret = -EFAULT; | ||
5514 | else | ||
5515 | ret = cpumask_size(); | ||
5516 | } | ||
5517 | free_cpumask_var(mask); | ||
5513 | 5518 | ||
5514 | return sizeof(cpumask_t); | 5519 | return ret; |
5515 | } | 5520 | } |
5516 | 5521 | ||
5517 | /** | 5522 | /** |