- 论坛徽章:
- 1
|
painc时,crash的那个core,会发出ipi通知其他core,然后其他core也执行dump_stack,于是看上去就是都死了
流程
panic()
crash_kexec(NULL)
kmsg_dump(KMSG_DUMP_PANIC);
smp_send_stop()
cpumask_t mask = cpu_online_map;
cpu_clear(smp_processor_id(), mask);
send_ipi_message(&mask, IPI_CPU_STOP);
struct ipi_data *ipi = &per_cpu(ipi_data, cpu); ipi->bits |= 1 << msg;
smp_cross_call(mask);
gic_raise_softirq(mask, 1);
writel(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
panic_blink_one_second()
以下是其余各个core对IPI_CPU_STOP的处理
do_IPI
struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
ipi_cpu_stop()
dump_stack();
set_cpu_online(cpu, false);
local_fiq_disable();
local_irq_disable();
while (1) cpu_relax();
所以panic会导致所有的core都最终进入死循环。 |
|