From: Mathieu Desnoyers Date: Tue, 17 Mar 2015 21:53:21 +0000 (-0400) Subject: Fix: compat_futex_noasync race condition X-Git-Tag: v0.7.14~5 X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=1f80e0f9f697b6a1d77cf493900013d0d0684b86;hp=1f80e0f9f697b6a1d77cf493900013d0d0684b86;p=userspace-rcu.git Fix: compat_futex_noasync race condition The Userspace RCU compatibility layer around sys_futex has a race condition which makes pretty much all "benchmark" tests hang pretty quickly on non-Linux systems (tested on Mac OS X). I narrowed it down to a bug in compat_futex_noasync: this compat layer uses a single pthread mutex and condition variable for all callers, independently of their uaddr. The FUTEX_WAKE performs a pthread cond broadcast to all waiters. FUTEX_WAIT must then compare *uaddr with val to see which thread has been awakened. Unfortunately, the check was not done again after each return from pthread_cond_wait(), thus causing the race. This race affects threads using the futex_noasync() compatibility layer concurrently, thus it affects only on non-Linux systems. Signed-off-by: Mathieu Desnoyers ---