From: Greg Kroah-Hartman Date: Sun, 22 Oct 2023 13:13:40 +0000 (+0200) Subject: 6.5-stable patches X-Git-Tag: v4.14.328~39 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d71193e51968a7e67f0f9f8fda11291756180a6f;p=thirdparty%2Fkernel%2Fstable-queue.git 6.5-stable patches added patches: powerpc-qspinlock-fix-stale-propagated-yield_cpu.patch --- diff --git a/queue-6.5/powerpc-qspinlock-fix-stale-propagated-yield_cpu.patch b/queue-6.5/powerpc-qspinlock-fix-stale-propagated-yield_cpu.patch new file mode 100644 index 00000000000..aa16f7a932f --- /dev/null +++ b/queue-6.5/powerpc-qspinlock-fix-stale-propagated-yield_cpu.patch @@ -0,0 +1,63 @@ +From f9bc9bbe8afdf83412728f0b464979a72a3b9ec2 Mon Sep 17 00:00:00 2001 +From: Nicholas Piggin +Date: Mon, 16 Oct 2023 22:43:00 +1000 +Subject: powerpc/qspinlock: Fix stale propagated yield_cpu + +From: Nicholas Piggin + +commit f9bc9bbe8afdf83412728f0b464979a72a3b9ec2 upstream. + +yield_cpu is a sample of a preempted lock holder that gets propagated +back through the queue. Queued waiters use this to yield to the +preempted lock holder without continually sampling the lock word (which +would defeat the purpose of MCS queueing by bouncing the cache line). + +The problem is that yield_cpu can become stale. It can take some time to +be passed down the chain, and if any queued waiter gets preempted then +it will cease to propagate the yield_cpu to later waiters. + +This can result in yielding to a CPU that no longer holds the lock, +which is bad, but particularly if it is currently in H_CEDE (idle), +then it appears to be preempted and some hypervisors (PowerVM) can +cause very long H_CONFER latencies waiting for H_CEDE wakeup. This +results in latency spikes and hard lockups on oversubscribed +partitions with lock contention. + +This is a minimal fix. Before yielding to yield_cpu, sample the lock +word to confirm yield_cpu is still the owner, and bail out of it is not. + +Thanks to a bunch of people who reported this and tracked down the +exact problem using tracepoints and dispatch trace logs. + +Fixes: 28db61e207ea ("powerpc/qspinlock: allow propagation of yield CPU down the queue") +Cc: stable@vger.kernel.org # v6.2+ +Reported-by: Srikar Dronamraju +Reported-by: Laurent Dufour +Reported-by: Shrikanth Hegde +Debugged-by: "Nysal Jan K.A" +Signed-off-by: Nicholas Piggin +Tested-by: Shrikanth Hegde +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20231016124305.139923-2-npiggin@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/powerpc/lib/qspinlock.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/powerpc/lib/qspinlock.c b/arch/powerpc/lib/qspinlock.c +index 253620979d0c..6dd2f46bd3ef 100644 +--- a/arch/powerpc/lib/qspinlock.c ++++ b/arch/powerpc/lib/qspinlock.c +@@ -406,6 +406,9 @@ static __always_inline bool yield_to_prev(struct qspinlock *lock, struct qnode * + if ((yield_count & 1) == 0) + goto yield_prev; /* owner vcpu is running */ + ++ if (get_owner_cpu(READ_ONCE(lock->val)) != yield_cpu) ++ goto yield_prev; /* re-sample lock owner */ ++ + spin_end(); + + preempted = true; +-- +2.42.0 + diff --git a/queue-6.5/series b/queue-6.5/series index e3c5bd0f261..a34eedfa03d 100644 --- a/queue-6.5/series +++ b/queue-6.5/series @@ -224,3 +224,4 @@ drm-panel-move-aux-b116xw03-out-of-panel-edp-back-to.patch drm-i915-cx0-only-clear-set-the-pipe-reset-bit-of-th.patch drm-amdgpu-fix-possible-null-pointer-dereference.patch powerpc-mm-allow-arch_force_max_order-up-to-12.patch +powerpc-qspinlock-fix-stale-propagated-yield_cpu.patch