mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
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: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Kai Huang <kai.huang@intel.com> Tested-by: Tao Liu <ltao@redhat.com> Link: https://lore.kernel.org/r/20240614095904.1345461-17-kirill.shutemov@linux.intel.com
This commit is contained in:
parent
db0936830a
commit
26ba7353ca
@ -35,6 +35,7 @@ struct smp_ops {
|
||||
int (*cpu_disable)(void);
|
||||
void (*cpu_die)(unsigned int cpu);
|
||||
void (*play_dead)(void);
|
||||
void (*stop_this_cpu)(void);
|
||||
|
||||
void (*send_call_func_ipi)(const struct cpumask *mask);
|
||||
void (*send_call_func_single_ipi)(int cpu);
|
||||
|
@ -835,6 +835,13 @@ void __noreturn stop_this_cpu(void *dummy)
|
||||
*/
|
||||
cpumask_clear_cpu(cpu, &cpus_stop_mask);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (smp_ops.stop_this_cpu) {
|
||||
smp_ops.stop_this_cpu();
|
||||
unreachable();
|
||||
}
|
||||
#endif
|
||||
|
||||
for (;;) {
|
||||
/*
|
||||
* 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)
|
||||
cpu_emergency_disable_virtualization();
|
||||
|
||||
atomic_dec(&waiting_for_crash_ipi);
|
||||
|
||||
if (smp_ops.stop_this_cpu) {
|
||||
smp_ops.stop_this_cpu();
|
||||
unreachable();
|
||||
}
|
||||
|
||||
/* Assume hlt works */
|
||||
halt();
|
||||
for (;;)
|
||||
|
Loading…
Reference in New Issue
Block a user