2010-04-06 07:05:25

by Anton Blanchard

[permalink] [raw]
Subject: [PATCH] sched: Fix sched_getaffinity


taskset on 2.6.34-rc3 fails on one of my ppc64 test boxes with the following
error:

sched_getaffinity(0, 16, 0x10029650030) = -1 EINVAL (Invalid argument)

This box has 128 threads and 16 bytes is enough to cover it. Commit
cd3d8031eb4311e516329aee03c79a08333141f1 (sched: sched_getaffinity(): Allow
less than NR_CPUS length) is comparing this 16 bytes agains nr_cpu_ids.

Fix it by comparing nr_cpu_ids to the number of bits in the cpumask we pass in.

Signed-off-by: Anton Blanchard <[email protected]>
---

diff --git a/kernel/sched.c b/kernel/sched.c
index 49d2fa7..0c1ec87 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4902,7 +4902,7 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
int ret;
cpumask_var_t mask;

- if (len < nr_cpu_ids)
+ if ((len * BITS_PER_BYTE) < nr_cpu_ids)
return -EINVAL;
if (len & (sizeof(unsigned long)-1))
return -EINVAL;


2010-04-06 07:21:10

by KOSAKI Motohiro

[permalink] [raw]
Subject: Re: [PATCH] sched: Fix sched_getaffinity

>
> taskset on 2.6.34-rc3 fails on one of my ppc64 test boxes with the following
> error:
>
> sched_getaffinity(0, 16, 0x10029650030) = -1 EINVAL (Invalid argument)
>
> This box has 128 threads and 16 bytes is enough to cover it. Commit
> cd3d8031eb4311e516329aee03c79a08333141f1 (sched: sched_getaffinity(): Allow
> less than NR_CPUS length) is comparing this 16 bytes agains nr_cpu_ids.
>
> Fix it by comparing nr_cpu_ids to the number of bits in the cpumask we pass in.
>
> Signed-off-by: Anton Blanchard <[email protected]>

Oops, yes yes, thanks to correct my moron ;-)
I'll stop all todays job and will get sleeping soon.
Reviewed-by: KOSAKI Motohiro <[email protected]>


> ---
>
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 49d2fa7..0c1ec87 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -4902,7 +4902,7 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
> int ret;
> cpumask_var_t mask;
>
> - if (len < nr_cpu_ids)
> + if ((len * BITS_PER_BYTE) < nr_cpu_ids)
> return -EINVAL;
> if (len & (sizeof(unsigned long)-1))
> return -EINVAL;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/


2010-04-06 08:32:54

by Anton Blanchard

[permalink] [raw]
Subject: [tip:sched/urgent] sched: Fix sched_getaffinity()

Commit-ID: 84fba5ec91f11c0efb27d0ed6098f7447491f0df
Gitweb: http://git.kernel.org/tip/84fba5ec91f11c0efb27d0ed6098f7447491f0df
Author: Anton Blanchard <[email protected]>
AuthorDate: Tue, 6 Apr 2010 17:02:19 +1000
Committer: Ingo Molnar <[email protected]>
CommitDate: Tue, 6 Apr 2010 10:01:35 +0200

sched: Fix sched_getaffinity()

taskset on 2.6.34-rc3 fails on one of my ppc64 test boxes with
the following error:

sched_getaffinity(0, 16, 0x10029650030) = -1 EINVAL (Invalid argument)

This box has 128 threads and 16 bytes is enough to cover it.

Commit cd3d8031eb4311e516329aee03c79a08333141f1 (sched:
sched_getaffinity(): Allow less than NR_CPUS length) is
comparing this 16 bytes agains nr_cpu_ids.

Fix it by comparing nr_cpu_ids to the number of bits in the
cpumask we pass in.

Signed-off-by: Anton Blanchard <[email protected]>
Reviewed-by: KOSAKI Motohiro <[email protected]>
Cc: Sharyathi Nagesh <[email protected]>
Cc: Ulrich Drepper <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Jack Steiner <[email protected]>
Cc: Russ Anderson <[email protected]>
Cc: Mike Travis <[email protected]>
LKML-Reference: <20100406070218.GM5594@kryten>
Signed-off-by: Ingo Molnar <[email protected]>
---
kernel/sched.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index 528a105..eaf5c73 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4902,7 +4902,7 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
int ret;
cpumask_var_t mask;

- if (len < nr_cpu_ids)
+ if ((len * BITS_PER_BYTE) < nr_cpu_ids)
return -EINVAL;
if (len & (sizeof(unsigned long)-1))
return -EINVAL;