Application threads calling futex_wait_requeue_pi run in an infinite loop in the kernel if the futex value changes during the call. The following patch fixes the problem. Signed-off-by: Dinakar Guniguntala <dino@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Darren Hart <dvhltc@xxxxxxxxxx> --- kernel/futex.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) Index: linux-2.6.31.4-rt14-lbf-f1/kernel/futex.c =================================================================== --- linux-2.6.31.4-rt14-lbf-f1.orig/kernel/futex.c +++ linux-2.6.31.4-rt14-lbf-f1/kernel/futex.c @@ -2188,6 +2188,12 @@ retry: spin_lock(&hb->lock); ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); spin_unlock(&hb->lock); + if (ret == -EAGAIN) { + /* Retry on spurious wakeup */ + put_futex_key(fshared, &q.key); + put_futex_key(fshared, &key2); + goto retry; + } if (ret) goto out_put_keys; @@ -2264,9 +2270,6 @@ out_put_keys: out_key2: put_futex_key(fshared, &key2); - /* Spurious wakeup ? */ - if (ret == -EAGAIN) - goto retry; out: if (to) { hrtimer_cancel(&to->timer); -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html