diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 117b7cad31b3..1038ca163890 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2607,7 +2607,7 @@ void wake_up_new_task(struct task_struct *p, unsigned long clone_flags) | |||
2607 | { | 2607 | { |
2608 | unsigned long flags; | 2608 | unsigned long flags; |
2609 | struct rq *rq; | 2609 | struct rq *rq; |
2610 | int cpu = get_cpu(); | 2610 | int cpu __maybe_unused = get_cpu(); |
2611 | 2611 | ||
2612 | #ifdef CONFIG_SMP | 2612 | #ifdef CONFIG_SMP |
2613 | /* | 2613 | /* |
@@ -4859,7 +4859,9 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, | |||
4859 | int ret; | 4859 | int ret; |
4860 | cpumask_var_t mask; | 4860 | cpumask_var_t mask; |
4861 | 4861 | ||
4862 | if (len < cpumask_size()) | 4862 | if (len < nr_cpu_ids) |
4863 | return -EINVAL; | ||
4864 | if (len & (sizeof(unsigned long)-1)) | ||
4863 | return -EINVAL; | 4865 | return -EINVAL; |
4864 | 4866 | ||
4865 | if (!alloc_cpumask_var(&mask, GFP_KERNEL)) | 4867 | if (!alloc_cpumask_var(&mask, GFP_KERNEL)) |
@@ -4867,10 +4869,12 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, | |||
4867 | 4869 | ||
4868 | ret = sched_getaffinity(pid, mask); | 4870 | ret = sched_getaffinity(pid, mask); |
4869 | if (ret == 0) { | 4871 | if (ret == 0) { |
4870 | if (copy_to_user(user_mask_ptr, mask, cpumask_size())) | 4872 | size_t retlen = min_t(size_t, len, cpumask_size()); |
4873 | |||
4874 | if (copy_to_user(user_mask_ptr, mask, retlen)) | ||
4871 | ret = -EFAULT; | 4875 | ret = -EFAULT; |
4872 | else | 4876 | else |
4873 | ret = cpumask_size(); | 4877 | ret = retlen; |
4874 | } | 4878 | } |
4875 | free_cpumask_var(mask); | 4879 | free_cpumask_var(mask); |
4876 | 4880 | ||