diff options
author | Maxime Ripard <mripard@kernel.org> | 2024-02-26 17:23:00 +0300 |
---|---|---|
committer | Maxime Ripard <mripard@kernel.org> | 2024-02-26 17:23:00 +0300 |
commit | 2f910859724b53f1cd3579246e3d9bebb16d78b8 (patch) | |
tree | 75cd2329b7e737865bf28ea734a2e0649c02a5bf /kernel/futex/core.c | |
parent | 86bf8cfda6d2a6720fa2e6e676c98f0882c9d3d7 (diff) | |
parent | 72fa02fdf83306c52bc1eede28359e3fa32a151a (diff) | |
download | linux-2f910859724b53f1cd3579246e3d9bebb16d78b8.tar.xz |
Merge drm/drm-fixes into drm-misc-fixes
Sima needs a more recent release to apply a patch.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
Diffstat (limited to 'kernel/futex/core.c')
-rw-r--r-- | kernel/futex/core.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/futex/core.c b/kernel/futex/core.c index e0e853412c15..1e78ef24321e 100644 --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -627,12 +627,21 @@ retry: } /* - * PI futexes can not be requeued and must remove themselves from the - * hash bucket. The hash bucket lock (i.e. lock_ptr) is held. + * PI futexes can not be requeued and must remove themselves from the hash + * bucket. The hash bucket lock (i.e. lock_ptr) is held. */ void futex_unqueue_pi(struct futex_q *q) { - __futex_unqueue(q); + /* + * If the lock was not acquired (due to timeout or signal) then the + * rt_waiter is removed before futex_q is. If this is observed by + * an unlocker after dropping the rtmutex wait lock and before + * acquiring the hash bucket lock, then the unlocker dequeues the + * futex_q from the hash bucket list to guarantee consistent state + * vs. userspace. Therefore the dequeue here must be conditional. + */ + if (!plist_node_empty(&q->list)) + __futex_unqueue(q); BUG_ON(!q->pi_state); put_pi_state(q->pi_state); |