• KOSAKI Motohiro's avatar
    cpumask: fix compat getaffinity · fa9dc265
    KOSAKI Motohiro authored
    Commit a45185d2 "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: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
    Reported-by: default avatarKen Werner <ken.werner@web.de>
    Cc: stable@kernel.org
    Cc: Andi Kleen <andi@firstfloor.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fa9dc265
compat.c 28.2 KB