Commit 1e6d5f72 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/qspinlock: Propagate sleepy if previous waiter is preempted



The sleepy (aka lock-owner-is-preempted) condition is propagated down
the queue by each waiter. If a waiter becomes preempted, it can no
longer propagate sleepy. To allow subsequent waiters to yield to the
lock owner, also check the lock owner in this case.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Tested-by: default avatarShrikanth Hegde <sshegde@linux.vnet.ibm.com>
Reviewed-by: default avatar"Nysal Jan K.A" <nysal@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20231016124305.139923-6-npiggin@gmail.com
parent fcf77d44
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -384,7 +384,11 @@ static __always_inline bool yield_to_prev(struct qspinlock *lock, struct qnode *
	if (!pv_yield_propagate_owner)
		goto yield_prev;

	if (node->sleepy) {
	/*
	 * If the previous waiter was preempted it might not be able to
	 * propagate sleepy to us, so check the lock in that case too.
	 */
	if (node->sleepy || vcpu_is_preempted(prev_cpu)) {
		u32 val = READ_ONCE(lock->val);

		if (val & _Q_LOCKED_VAL) {