Messages in this thread | | | Date | Tue, 3 Aug 2021 12:28:08 +0200 | From | Peter Zijlstra <> | Subject | Re: [patch 58/63] futex: Prevent requeue_pi() lock nesting issue on RT |
| |
On Mon, Aug 02, 2021 at 02:56:09PM +0200, Peter Zijlstra wrote: > static inline void futex_requeue_pi_complete(struct futex_q *q, int locked) > { > + int old, new; > > + old = atomic_read_acquire(&q->requeue_state); > + do {
if (old == Q_REQUEUE_PI_IGNORE) return;
> if (locked >= 0) {
WARN_ON_ONCE(old != Q_REQUEUE_PI_IN_PROGRESS && old != Q_REQUEUE_PI_WAIT)
> /* Requeue succeeded. Set DONE or LOCKED */ > new = Q_REQUEUE_PI_DONE + locked; > + } else if (old == Q_REQUEUE_PI_IN_PROGRESS) { > /* Deadlock, no early wakeup interleave */ > new = Q_REQUEUE_PI_NONE; > } else {
WARN_ON_ONCE(old != Q_REQUEUE_PI_WAIT);
> /* Deadlock, early wakeup interleave. */ > new = Q_REQUEUE_PI_IGNORE; > } > + } while (!atomic_try_cmpxchg(&q->requeue_state, &old, new)); > > #ifdef CONFIG_PREEMPT_RT > /* If the waiter interleaved with the requeue let it know */ > + if (unlikely(old == Q_REQUEUE_PI_WAIT)) > rcuwait_wake_up(&q->requeue_wait); > #endif > }
I think...
| |