Commit 26ba7353 authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Borislav Petkov (AMD)

x86/smp: Add smp_ops.stop_this_cpu() callback

If the helper is defined, it is called instead of halt() to stop the CPU at the
end of stop_this_cpu() and on crash CPU shutdown.

ACPI MADT will use it to hand over the CPU to BIOS in order to be able to wake
it up again after kexec.
Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarKai Huang <kai.huang@intel.com>
Tested-by: default avatarTao Liu <ltao@redhat.com>
Link: https://lore.kernel.org/r/20240614095904.1345461-17-kirill.shutemov@linux.intel.com
parent db093683
...@@ -35,6 +35,7 @@ struct smp_ops { ...@@ -35,6 +35,7 @@ struct smp_ops {
int (*cpu_disable)(void); int (*cpu_disable)(void);
void (*cpu_die)(unsigned int cpu); void (*cpu_die)(unsigned int cpu);
void (*play_dead)(void); void (*play_dead)(void);
void (*stop_this_cpu)(void);
void (*send_call_func_ipi)(const struct cpumask *mask); void (*send_call_func_ipi)(const struct cpumask *mask);
void (*send_call_func_single_ipi)(int cpu); void (*send_call_func_single_ipi)(int cpu);
......
...@@ -835,6 +835,13 @@ void __noreturn stop_this_cpu(void *dummy) ...@@ -835,6 +835,13 @@ void __noreturn stop_this_cpu(void *dummy)
*/ */
cpumask_clear_cpu(cpu, &cpus_stop_mask); cpumask_clear_cpu(cpu, &cpus_stop_mask);
#ifdef CONFIG_SMP
if (smp_ops.stop_this_cpu) {
smp_ops.stop_this_cpu();
unreachable();
}
#endif
for (;;) { for (;;) {
/* /*
* Use native_halt() so that memory contents don't change * Use native_halt() so that memory contents don't change
......
...@@ -880,6 +880,12 @@ static int crash_nmi_callback(unsigned int val, struct pt_regs *regs) ...@@ -880,6 +880,12 @@ static int crash_nmi_callback(unsigned int val, struct pt_regs *regs)
cpu_emergency_disable_virtualization(); cpu_emergency_disable_virtualization();
atomic_dec(&waiting_for_crash_ipi); atomic_dec(&waiting_for_crash_ipi);
if (smp_ops.stop_this_cpu) {
smp_ops.stop_this_cpu();
unreachable();
}
/* Assume hlt works */ /* Assume hlt works */
halt(); halt();
for (;;) for (;;)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment