| From b42c30b432d7c51975755e2746212ef728aabb3c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Jun 2021 14:12:45 +1000 |
| Subject: powerpc: Offline CPU in stop_this_cpu() |
| |
| From: Nicholas Piggin <npiggin@gmail.com> |
| |
| [ Upstream commit bab26238bbd44d5a4687c0a64fd2c7f2755ea937 ] |
| |
| printk_safe_flush_on_panic() has special lock breaking code for the case |
| where we panic()ed with the console lock held. It relies on panic IPI |
| causing other CPUs to mark themselves offline. |
| |
| Do as most other architectures do. |
| |
| This effectively reverts commit de6e5d38417e ("powerpc: smp_send_stop do |
| not offline stopped CPUs"), unfortunately it may result in some false |
| positive warnings, but the alternative is more situations where we can |
| crash without getting messages out. |
| |
| Fixes: de6e5d38417e ("powerpc: smp_send_stop do not offline stopped CPUs") |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20210623041245.865134-1-npiggin@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kernel/smp.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c |
| index 0760230be56f..26a028a9233a 100644 |
| --- a/arch/powerpc/kernel/smp.c |
| +++ b/arch/powerpc/kernel/smp.c |
| @@ -600,6 +600,8 @@ static void nmi_stop_this_cpu(struct pt_regs *regs) |
| /* |
| * IRQs are already hard disabled by the smp_handle_nmi_ipi. |
| */ |
| + set_cpu_online(smp_processor_id(), false); |
| + |
| spin_begin(); |
| while (1) |
| spin_cpu_relax(); |
| @@ -615,6 +617,15 @@ void smp_send_stop(void) |
| static void stop_this_cpu(void *dummy) |
| { |
| hard_irq_disable(); |
| + |
| + /* |
| + * Offlining CPUs in stop_this_cpu can result in scheduler warnings, |
| + * (see commit de6e5d38417e), but printk_safe_flush_on_panic() wants |
| + * to know other CPUs are offline before it breaks locks to flush |
| + * printk buffers, in case we panic()ed while holding the lock. |
| + */ |
| + set_cpu_online(smp_processor_id(), false); |
| + |
| spin_begin(); |
| while (1) |
| spin_cpu_relax(); |
| -- |
| 2.30.2 |
| |