提交 e134f914 编写于 作者: N Nicholas Piggin 提交者: Zheng Zengkai

powerpc: Offline CPU in stop_this_cpu()

stable inclusion
from stable-5.10.50
commit d3358c66ee5607b17bb0831edbff1b27ffe4979b
bugzilla: 174522 https://gitee.com/openeuler/kernel/issues/I4DNFY

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=d3358c66ee5607b17bb0831edbff1b27ffe4979b

--------------------------------

[ Upstream commit bab26238 ]

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 de6e5d38 ("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: de6e5d38 ("powerpc: smp_send_stop do not offline stopped CPUs")
Signed-off-by: NNicholas Piggin <npiggin@gmail.com>
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210623041245.865134-1-npiggin@gmail.comSigned-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 1de89c71
...@@ -600,6 +600,8 @@ static void nmi_stop_this_cpu(struct pt_regs *regs) ...@@ -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. * IRQs are already hard disabled by the smp_handle_nmi_ipi.
*/ */
set_cpu_online(smp_processor_id(), false);
spin_begin(); spin_begin();
while (1) while (1)
spin_cpu_relax(); spin_cpu_relax();
...@@ -615,6 +617,15 @@ void smp_send_stop(void) ...@@ -615,6 +617,15 @@ void smp_send_stop(void)
static void stop_this_cpu(void *dummy) static void stop_this_cpu(void *dummy)
{ {
hard_irq_disable(); 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(); spin_begin();
while (1) while (1)
spin_cpu_relax(); spin_cpu_relax();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册