Message ID | 20200919032009.8346-1-samuel@sholland.org (mailing list archive) |
---|---|
State | Rejected, archived |
Headers | show |
Series | powerpc: Select HAVE_FUTEX_CMPXCHG | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (ace1986562a0814f179ecd2f1e648215ebc6625a) |
snowpatch_ozlabs/build-ppc64le | warning | Upstream build failed, couldn't test patch |
snowpatch_ozlabs/build-ppc64be | warning | Upstream build failed, couldn't test patch |
snowpatch_ozlabs/build-ppc64e | warning | Upstream build failed, couldn't test patch |
snowpatch_ozlabs/build-pmac32 | warning | Upstream build failed, couldn't test patch |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 7 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
From: Samuel Holland > Sent: 19 September 2020 04:20 > > On powerpc, access_ok() succeeds for the NULL pointer. This breaks the > dynamic check in futex_detect_cmpxchg(), which expects -EFAULT. As a > result, robust futex operations are not functional on powerpc. access_ok(NULL, sane_count) will succeed on all (maybe most) architectures. All access_ok() does is check that kernel addresses aren't referenced. (access_ok(kernel_adress, 0) is also likely to succeed.) It is the access to user-address 0 that is expected to fault. If this isn't faulting something else is wrong. Historically (at least pre-elf, if not before) user programs were linked to address zero - so the page was mapped. (Linux may be too new to actually require it.) Not sure what 'wine' requires for win-32 execuatbles. ISTR there are also some 'crazy' ARM? cpu that read the interrupt vectors from address 0 in user-space. So assuming: static void __init futex_detect_cmpxchg(void) { #ifndef CONFIG_HAVE_FUTEX_CMPXCHG u32 curval; /* * This will fail and we want it. Some arch implementations do * runtime detection of the futex_atomic_cmpxchg_inatomic() * functionality. We want to know that before we call in any * of the complex code paths. Also we want to prevent * registration of robust lists in that case. NULL is * guaranteed to fault and we get -EFAULT on functional * implementation, the non-functional ones will return * -ENOSYS. */ if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT) futex_cmpxchg_enabled = 1; #endif } will fail -EFAULT because user address 0 is invalid seems hopeful. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index ad620637cbd1..5ad1deb0c669 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -196,6 +196,7 @@ config PPC select HAVE_FUNCTION_ERROR_INJECTION select HAVE_FUNCTION_GRAPH_TRACER select HAVE_FUNCTION_TRACER + select HAVE_FUTEX_CMPXCHG select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx) select HAVE_IDE
On powerpc, access_ok() succeeds for the NULL pointer. This breaks the dynamic check in futex_detect_cmpxchg(), which expects -EFAULT. As a result, robust futex operations are not functional on powerpc. Since the architecture's futex_atomic_cmpxchg_inatomic() implementation requires no runtime feature detection, we can select HAVE_FUTEX_CMPXCHG to skip futex_detect_cmpxchg() and enable the use of robust futexes. Signed-off-by: Samuel Holland <samuel@sholland.org> --- arch/powerpc/Kconfig | 1 + 1 file changed, 1 insertion(+)