Files
kernel/include/linux
Thomas Gleixner a0c1e9073e 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>
2008-02-23 17:12:15 -08:00
..
2008-02-06 10:41:15 -08:00
2008-02-07 08:42:23 -08:00
2008-02-14 21:17:08 -08:00
2008-02-05 09:44:13 -08:00
2008-02-10 18:11:16 -05:00
2008-02-05 03:20:13 -08:00
2008-02-06 10:41:02 -08:00
2008-02-19 10:04:00 +01:00
2008-01-28 15:00:14 -08:00
2008-02-19 10:04:00 +01:00
2008-01-29 21:55:15 +01:00
2008-02-03 17:45:46 +02:00
2008-02-14 20:58:05 -08:00
2008-01-30 13:31:10 +01:00
2008-02-03 17:45:46 +02:00
2008-02-03 15:42:53 +02:00
2008-02-08 02:09:56 +00:00
2008-02-08 09:22:24 -08:00
2008-02-07 08:42:30 -08:00
2008-02-03 17:45:46 +02:00
2008-02-19 10:04:00 +01:00
2008-02-03 15:42:53 +02:00
2008-02-11 13:01:51 +01:00
2008-02-05 09:44:19 -08:00
2008-01-30 13:30:27 +01:00
2008-02-13 16:21:18 -08:00
2008-02-07 20:39:44 -05:00
2008-02-11 09:20:50 -08:00
2008-02-01 16:13:16 -05:00
2008-01-28 15:07:58 -08:00
2008-01-28 15:07:57 -08:00
2008-02-19 21:00:18 +01:00
2008-01-31 19:28:20 -08:00
2008-02-13 16:21:18 -08:00
2008-01-28 23:58:27 -05:00
2008-02-06 10:41:21 -08:00
2008-02-08 09:22:29 -08:00
2008-02-19 01:41:26 +01:00
2008-02-20 12:12:47 -05:00
2008-02-13 16:21:18 -08:00
2008-02-03 17:45:46 +02:00
2008-02-06 10:41:01 -08:00
2008-02-14 14:22:12 +09:00
2008-02-23 17:12:14 -08:00
2008-02-08 09:22:31 -08:00
2008-02-14 21:13:33 -08:00
2008-01-28 14:56:29 -08:00
2008-01-30 02:06:08 -05:00
2008-02-06 16:29:59 +11:00
2008-02-14 21:13:33 -08:00
2008-02-02 11:32:01 -08:00
2008-02-10 12:52:46 -08:00
2008-02-02 02:44:34 +03:00
2008-02-07 23:11:56 -08:00
2008-02-06 10:41:20 -08:00
2008-02-08 09:22:31 -08:00
2008-02-08 09:22:26 -08:00
2008-02-05 09:44:22 -08:00
2008-01-30 13:31:47 +01:00
2008-02-08 09:22:41 -08:00
2008-01-31 19:26:46 -08:00
2008-02-07 08:42:34 -08:00
2008-02-07 08:42:30 -08:00
2008-02-08 09:22:41 -08:00
2008-02-08 09:22:27 -08:00
2008-02-03 17:45:46 +02:00
2008-01-31 19:28:30 -08:00
2008-01-30 13:31:20 +01:00
2008-01-30 13:31:20 +01:00
2008-02-08 09:22:31 -08:00
2008-02-07 08:42:34 -08:00
2008-02-05 09:44:07 -08:00
2008-02-01 17:45:14 +01:00
2008-02-07 08:42:16 -08:00
2008-02-08 09:22:34 -08:00
2008-02-08 09:22:36 -08:00
2008-02-04 23:50:13 +11:00
2008-02-04 23:50:03 +11:00
2008-02-04 23:50:02 +11:00
2008-02-04 23:50:03 +11:00
2008-02-06 10:41:03 -08:00
2008-02-03 15:42:53 +02:00