# git gc Expanding reachable commits in commit graph: 54517 Expanding reachable commits in commit graph: 112083 Expanding reachable commits in commit graph: 170476 Expanding reachable commits in commit graph: 230057 Expanding reachable commits in commit graph: 289248 Expanding reachable commits in commit graph: 350148 Expanding reachable commits in commit graph: 411477 Expanding reachable commits in commit graph: 473308 Expanding reachable commits in commit graph: 532486 Expanding reachable commits in commit graph: 595366 Expanding reachable commits in commit graph: 658394 Expanding reachable commits in commit graph: 721406 Expanding reachable commits in commit graph: 784433 Expanding reachable commits in commit graph: 847092 Expanding reachable commits in commit graph: 909361 Expanding reachable commits in commit graph: 971686 Expanding reachable commits in commit graph: 1034586 Expanding reachable commits in commit graph: 1094468 Expanding reachable commits in commit graph: 1153180 Expanding reachable commits in commit graph: 1166087, done. Writing out commit graph in 4 passes: 57% (2665423/4664348) Writing out commit graph in 4 passes: 58% (2705322/4664348) Writing out commit graph in 4 passes: 59% (2751966/4664348) Writing out commit graph in 4 passes: 60% (2798609/4664348) Writing out commit graph in 4 passes: 61% (2845253/4664348) Writing out commit graph in 4 passes: 62% (2891896/4664348) Writing out commit graph in 4 passes: 63% (2938540/4664348) Writing out commit graph in 4 passes: 64% (2985183/4664348) Writing out commit graph in 4 passes: 65% (3031827/4664348) Writing out commit graph in 4 passes: 66% (3078470/4664348) Writing out commit graph in 4 passes: 67% (3125114/4664348) Writing out commit graph in 4 passes: 67% (3156544/4664348) Writing out commit graph in 4 passes: 68% (3171757/4664348) Writing out commit graph in 4 passes: 69% (3218401/4664348) Writing out commit graph in 4 passes: 70% (3265044/4664348) Writing out commit graph in 4 passes: 71% (3311688/4664348) Writing out commit graph in 4 passes: 72% (3358331/4664348) Writing out commit graph in 4 passes: 73% (3404975/4664348) Writing out commit graph in 4 passes: 74% (3451618/4664348) Writing out commit graph in 4 passes: 75% (3498261/4664348) Writing out commit graph in 4 passes: 76% (3544905/4664348) Writing out commit graph in 4 passes: 77% (3591548/4664348) Writing out commit graph in 4 passes: 78% (3638192/4664348) Writing out commit graph in 4 passes: 79% (3684835/4664348) Writing out commit graph in 4 passes: 80% (3731479/4664348) Writing out commit graph in 4 passes: 81% (3778122/4664348) Writing out commit graph in 4 passes: 82% (3824766/4664348) Writing out commit graph in 4 passes: 83% (3871409/4664348) Writing out commit graph in 4 passes: 84% (3918053/4664348) Writing out commit graph in 4 passes: 85% (3964696/4664348) Writing out commit graph in 4 passes: 86% (4011340/4664348) Writing out commit graph in 4 passes: 87% (4057983/4664348) Writing out commit graph in 4 passes: 88% (4104627/4664348) Writing out commit graph in 4 passes: 89% (4151270/4664348) Writing out commit graph in 4 passes: 90% (4197914/4664348) Writing out commit graph in 4 passes: 91% (4244557/4664348) Writing out commit graph in 4 passes: 92% (4291201/4664348) Writing out commit graph in 4 passes: 93% (4337844/4664348) Writing out commit graph in 4 passes: 94% (4384488/4664348) Writing out commit graph in 4 passes: 95% (4431131/4664348) Writing out commit graph in 4 passes: 96% (4477775/4664348) Writing out commit graph in 4 passes: 97% (4524418/4664348) Writing out commit graph in 4 passes: 98% (4571062/4664348) Writing out commit graph in 4 passes: 99% (4617705/4664348) Writing out commit graph in 4 passes: 100% (4664348/4664348) Writing out commit graph in 4 passes: 100% (4664348/4664348), done. # git rev-parse -q --verify 734ad0af3609464f8f93e00b6c0de1e112f44559^{commit} 734ad0af3609464f8f93e00b6c0de1e112f44559 already have revision, skipping fetch # git checkout -q -f -B kisskb 734ad0af3609464f8f93e00b6c0de1e112f44559 # git clean -qxdf # < git log -1 # commit 734ad0af3609464f8f93e00b6c0de1e112f44559 # Author: Nysal Jan K.A. # Date: Thu Aug 29 07:58:27 2024 +0530 # # powerpc/qspinlock: Fix deadlock in MCS queue # # If an interrupt occurs in queued_spin_lock_slowpath() after we increment # qnodesp->count and before node->lock is initialized, another CPU might # see stale lock values in get_tail_qnode(). If the stale lock value happens # to match the lock on that CPU, then we write to the "next" pointer of # the wrong qnode. This causes a deadlock as the former CPU, once it becomes # the head of the MCS queue, will spin indefinitely until it's "next" pointer # is set by its successor in the queue. # # Running stress-ng on a 16 core (16EC/16VP) shared LPAR, results in # occasional lockups similar to the following: # # $ stress-ng --all 128 --vm-bytes 80% --aggressive \ # --maximize --oomable --verify --syslog \ # --metrics --times --timeout 5m # # watchdog: CPU 15 Hard LOCKUP # ...... # NIP [c0000000000b78f4] queued_spin_lock_slowpath+0x1184/0x1490 # LR [c000000001037c5c] _raw_spin_lock+0x6c/0x90 # Call Trace: # 0xc000002cfffa3bf0 (unreliable) # _raw_spin_lock+0x6c/0x90 # raw_spin_rq_lock_nested.part.135+0x4c/0xd0 # sched_ttwu_pending+0x60/0x1f0 # __flush_smp_call_function_queue+0x1dc/0x670 # smp_ipi_demux_relaxed+0xa4/0x100 # xive_muxed_ipi_action+0x20/0x40 # __handle_irq_event_percpu+0x80/0x240 # handle_irq_event_percpu+0x2c/0x80 # handle_percpu_irq+0x84/0xd0 # generic_handle_irq+0x54/0x80 # __do_irq+0xac/0x210 # __do_IRQ+0x74/0xd0 # 0x0 # do_IRQ+0x8c/0x170 # hardware_interrupt_common_virt+0x29c/0x2a0 # --- interrupt: 500 at queued_spin_lock_slowpath+0x4b8/0x1490 # ...... # NIP [c0000000000b6c28] queued_spin_lock_slowpath+0x4b8/0x1490 # LR [c000000001037c5c] _raw_spin_lock+0x6c/0x90 # --- interrupt: 500 # 0xc0000029c1a41d00 (unreliable) # _raw_spin_lock+0x6c/0x90 # futex_wake+0x100/0x260 # do_futex+0x21c/0x2a0 # sys_futex+0x98/0x270 # system_call_exception+0x14c/0x2f0 # system_call_vectored_common+0x15c/0x2ec # # The following code flow illustrates how the deadlock occurs. # For the sake of brevity, assume that both locks (A and B) are # contended and we call the queued_spin_lock_slowpath() function. # # CPU0 CPU1 # ---- ---- # spin_lock_irqsave(A) | # spin_unlock_irqrestore(A) | # spin_lock(B) | # | | # ▼ | # id = qnodesp->count++; | # (Note that nodes[0].lock == A) | # | | # ▼ | # Interrupt | # (happens before "nodes[0].lock = B") | # | | # ▼ | # spin_lock_irqsave(A) | # | | # ▼ | # id = qnodesp->count++ | # nodes[1].lock = A | # | | # ▼ | # Tail of MCS queue | # | spin_lock_irqsave(A) # ▼ | # Head of MCS queue ▼ # | CPU0 is previous tail # ▼ | # Spin indefinitely ▼ # (until "nodes[1].next != NULL") prev = get_tail_qnode(A, CPU0) # | # ▼ # prev == &qnodes[CPU0].nodes[0] # (as qnodes[CPU0].nodes[0].lock == A) # | # ▼ # WRITE_ONCE(prev->next, node) # | # ▼ # Spin indefinitely # (until nodes[0].locked == 1) # # Thanks to Saket Kumar Bhaskar for help with recreating the issue # # Fixes: 84990b169557 ("powerpc/qspinlock: add mcs queueing for contended waiters") # Cc: stable@vger.kernel.org # v6.2+ # Reported-by: Geetika Moolchandani # Reported-by: Vaishnavi Bhat # Reported-by: Jijo Varghese # Signed-off-by: Nysal Jan K.A. # Reviewed-by: Nicholas Piggin # Signed-off-by: Michael Ellerman # Link: https://msgid.link/20240829022830.1164355-1-nysal@linux.ibm.com # < /opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux-gcc --version # < /opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux-ld --version # < git log --format=%s --max-count=1 734ad0af3609464f8f93e00b6c0de1e112f44559 # make -s -j 160 ARCH=m68k O=/kisskb/build/powerpc-fixes_defconfig_m68k-gcc13 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux- defconfig # < make -s -j 160 ARCH=m68k O=/kisskb/build/powerpc-fixes_defconfig_m68k-gcc13 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux- help # make -s -j 160 ARCH=m68k O=/kisskb/build/powerpc-fixes_defconfig_m68k-gcc13 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux- olddefconfig # make -s -j 160 ARCH=m68k O=/kisskb/build/powerpc-fixes_defconfig_m68k-gcc13 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-13.1.0-nolibc/m68k-linux/bin/m68k-linux- Completed OK # rm -rf /kisskb/build/powerpc-fixes_defconfig_m68k-gcc13 # Build took: 0:07:48.432488