diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-02-23 18:23:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-23 20:12:15 -0500 |
commit | a0c1e9073ef7428a14309cba010633a6cd6719ea (patch) | |
tree | 05ce792ddcde92e73d1bae4c8e20f607a2e7db40 /include | |
parent | 3e4ab747efa8e78562ec6782b08bbf21a00aba1b (diff) |
futex: runtime enable pi and robust functionality
Not all architectures implement futex_atomic_cmpxchg_inatomic(). The default
implementation returns -ENOSYS, which is currently not handled inside of the
futex guts.
Futex PI calls and robust list exits with a held futex result in an endless
loop in the futex code on architectures which have no support.
Fixing up every place where futex_atomic_cmpxchg_inatomic() is called would
add a fair amount of extra if/else constructs to the already complex code. It
is also not possible to disable the robust feature before user space tries to
register robust lists.
Compile time disabling is not a good idea either, as there are already
architectures with runtime detection of futex_atomic_cmpxchg_inatomic support.
Detect the functionality at runtime instead by calling
cmpxchg_futex_value_locked() with a NULL pointer from the futex initialization
code. This is guaranteed to fail, but the call of
futex_atomic_cmpxchg_inatomic() happens with pagefaults disabled.
On architectures, which use the asm-generic implementation or have a runtime
CPU feature detection, a -ENOSYS return value disables the PI/robust features.
On architectures with a working implementation the call returns -EFAULT and
the PI/robust features are enabled.
The relevant syscalls return -ENOSYS and the robust list exit code is blocked,
when the detection fails.
Fixes http://lkml.org/lkml/2008/2/11/149
Originally reported by: Lennart Buytenhek
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Ingo Molnar <mingo@elte.hu>
Cc: Lennert Buytenhek <buytenh@wantstofly.org>
Cc: Riku Voipio <riku.voipio@movial.fi>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/futex.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/futex.h b/include/linux/futex.h index 90048fb28a38..586ab56a3ec3 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
@@ -167,6 +167,7 @@ union futex_key { | |||
167 | #ifdef CONFIG_FUTEX | 167 | #ifdef CONFIG_FUTEX |
168 | extern void exit_robust_list(struct task_struct *curr); | 168 | extern void exit_robust_list(struct task_struct *curr); |
169 | extern void exit_pi_state_list(struct task_struct *curr); | 169 | extern void exit_pi_state_list(struct task_struct *curr); |
170 | extern int futex_cmpxchg_enabled; | ||
170 | #else | 171 | #else |
171 | static inline void exit_robust_list(struct task_struct *curr) | 172 | static inline void exit_robust_list(struct task_struct *curr) |
172 | { | 173 | { |