diff options
author | KOSAKI Motohiro <[email protected]> | 2010-05-19 09:37:41 +0900 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2010-05-19 11:48:18 -0700 |
commit | fa9dc265ace9774e62f0e31108e5f47911124bda (patch) | |
tree | f5230efca0ccf0cfec7690a6c45209cff938d740 /net/lapb/lapb_in.c | |
parent | cf77e988ddfc7f047ac1ddc72cadb5eee7e09293 (diff) |
cpumask: fix compat getaffinity
Commit a45185d2d "cpumask: convert kernel/compat.c" broke libnuma, which
abuses sched_getaffinity to find out NR_CPUS in order to parse
/sys/devices/system/node/node*/cpumap.
On NUMA systems with less than 32 possibly CPUs, the current
compat_sys_sched_getaffinity now returns '4' instead of the actual
NR_CPUS/8, which makes libnuma bail out when parsing the cpumap.
The libnuma call sched_getaffinity(0, bitmap, 4096) at first. It mean
the libnuma expect the return value of sched_getaffinity() is either len
argument or NR_CPUS. But it doesn't expect to return nr_cpu_ids.
Strictly speaking, userland requirement are
1) Glibc assume the return value mean the lengh of initialized
of mask argument. E.g. if sched_getaffinity(1024) return 128,
glibc make zero fill rest 896 byte.
2) Libnuma assume the return value can be used to guess NR_CPUS
in kernel. It assume len-arg<NR_CPUS makes -EINVAL. But
it try len=4096 at first and 4096 is always bigger than
NR_CPUS. Then, if we remove strange min_length normalization,
we never hit -EINVAL case.
sched_getaffinity() already solved this issue. This patch adapts
compat_sys_sched_getaffinity() to match the non-compat case.
Signed-off-by: KOSAKI Motohiro <[email protected]>
Acked-by: Rusty Russell <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Reported-by: Ken Werner <[email protected]>
Cc: [email protected]
Cc: Andi Kleen <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'net/lapb/lapb_in.c')
0 files changed, 0 insertions, 0 deletions