/* This keeps a track of which one is crashing cpu. */ staticint crashing_cpu = -1; static cpumask_t cpus_in_crash = CPU_MASK_NONE;
#ifdef CONFIG_SMP staticvoid crash_shutdown_secondary(void *passed_regs)
{ struct pt_regs *regs = passed_regs; int cpu = smp_processor_id();
/* * If we are passed registers, use those. Otherwise get the * regs from the last interrupt, which should be correct, as * we are in an interrupt. But if the regs are not there, * pull them from the top of the stack. They are probably * wrong, but we need something to keep from crashing again.
*/ if (!regs)
regs = get_irq_regs(); if (!regs)
regs = task_pt_regs(current);
if (!cpu_online(cpu)) return;
/* We won't be sent IPIs any more. */
set_cpu_online(cpu, false);
local_irq_disable(); if (!cpumask_test_cpu(cpu, &cpus_in_crash))
crash_save_cpu(regs, cpu);
cpumask_set_cpu(cpu, &cpus_in_crash);
while (!atomic_read(&kexec_ready_to_reboot))
cpu_relax();
/* * The crash CPU sends an IPI and wait for other CPUs to * respond. Delay of at least 10 seconds.
*/
pr_emerg("Sending IPI to other cpus...\n");
msecs = 10000; while ((cpumask_weight(&cpus_in_crash) < ncpus) && (--msecs > 0)) {
cpu_relax();
mdelay(1);
}
cpus_stopped = 1;
}
/* Override the weak function in kernel/panic.c */ void crash_smp_send_stop(void)
{ if (_crash_smp_send_stop)
_crash_smp_send_stop();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.