From: Mathieu Desnoyers Date: Wed, 22 Jun 2022 20:28:53 +0000 (-0400) Subject: Fix: workqueue: futex wait: handle spurious futex wakeups X-Git-Tag: v0.14.0~31 X-Git-Url: http://git.lttng.org/?a=commitdiff_plain;h=80c34c2de3d970eb82049798357743cfa71e8b54;hp=80c34c2de3d970eb82049798357743cfa71e8b54;p=userspace-rcu.git Fix: workqueue: futex wait: handle spurious futex wakeups Observed issue ============== The workqueue thread futex_wait() returns with a workqueue->futex state of -1, which is unexpected. In this situation, the workqueue thread is observed to use 99% of CPU as workqueue->futex values are decremented to very low negative values while the workqueue is empty. This issue will cause spurious unexpected high CPU use, but will not lead to data corruption. Cause ===== From futex(5): FUTEX_WAIT Returns 0 if the caller was woken up. Note that a wake-up can also be caused by common futex usage patterns in unrelated code that happened to have previously used the futex word's memory location (e.g., typical futex-based implementations of Pthreads mutexes can cause this under some conditions). Therefore, call‐ ers should always conservatively assume that a return value of 0 can mean a spurious wake-up, and use the futex word's value (i.e., the user-space synchronization scheme) to decide whether to continue to block or not. Solution ======== We therefore need to validate whether the value differs from -1 in user-space after the call to FUTEX_WAIT returns 0. Known drawbacks =============== None. Signed-off-by: Mathieu Desnoyers Change-Id: Id024e7d3b2dab75d30fc01280fd27e5f2d8af0d1 ---