|
@@ -157,7 +157,9 @@
|
|
* enqueue.
|
|
* enqueue.
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
|
|
int __read_mostly futex_cmpxchg_enabled;
|
|
int __read_mostly futex_cmpxchg_enabled;
|
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
* Futex flags used to encode options to functions and preserve them across
|
|
* Futex flags used to encode options to functions and preserve them across
|
|
@@ -2843,9 +2845,28 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
|
|
return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
|
|
return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
|
|
}
|
|
}
|
|
|
|
|
|
-static int __init futex_init(void)
|
|
|
|
|
|
+static void __init futex_detect_cmpxchg(void)
|
|
{
|
|
{
|
|
|
|
+#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
|
|
u32 curval;
|
|
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
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int __init futex_init(void)
|
|
|
|
+{
|
|
unsigned int futex_shift;
|
|
unsigned int futex_shift;
|
|
unsigned long i;
|
|
unsigned long i;
|
|
|
|
|
|
@@ -2861,18 +2882,8 @@ static int __init futex_init(void)
|
|
&futex_shift, NULL,
|
|
&futex_shift, NULL,
|
|
futex_hashsize, futex_hashsize);
|
|
futex_hashsize, futex_hashsize);
|
|
futex_hashsize = 1UL << futex_shift;
|
|
futex_hashsize = 1UL << futex_shift;
|
|
- /*
|
|
|
|
- * 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;
|
|
|
|
|
|
+
|
|
|
|
+ futex_detect_cmpxchg();
|
|
|
|
|
|
for (i = 0; i < futex_hashsize; i++) {
|
|
for (i = 0; i < futex_hashsize; i++) {
|
|
plist_head_init(&futex_queues[i].chain);
|
|
plist_head_init(&futex_queues[i].chain);
|