[PATCH] Add call to non-crashing cores through IPI
Maxim Uvarov
muvarov at gmail.com
Mon Nov 22 04:47:28 EST 2010
2010/11/22 Mika Westerberg <mika.westerberg at iki.fi>:
> On Fri, Nov 19, 2010 at 11:08:30AM +0100, Per Fransson wrote:
>> When kexec is used to start a crash kernel the other cores
>> are notified. These non-crashing cores will save their state
>> in the crash notes and then do nothing.
>>
>> Signed-off-by: Per Fransson <per.xx.fransson at stericsson.com>
>> ---
>> arch/arm/kernel/machine_kexec.c | 28 ++++++++++++++++++++++++++++
>> 1 files changed, 28 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
>> index 3a8fd51..56683db 100644
>> --- a/arch/arm/kernel/machine_kexec.c
>> +++ b/arch/arm/kernel/machine_kexec.c
>> @@ -23,6 +23,8 @@ extern unsigned long kexec_indirection_page;
>> extern unsigned long kexec_mach_type;
>> extern unsigned long kexec_boot_atags;
>>
>> +static atomic_t waiting_for_crash_ipi;
>> +
>> /*
>> * Provide a dummy crash_notes definition while crash dump arrives to arm.
>> * This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
>> @@ -37,8 +39,34 @@ void machine_kexec_cleanup(struct kimage *image)
>> {
>> }
>>
>> +void machine_crash_nonpanic_core(void *unused)
>> +{
>> + struct pt_regs regs;
>> +
>> + crash_setup_regs(®s, NULL);
>> + printk(KERN_EMERG "CPU %u will stop doing anything useful since another CPU has crashed\n",
>> + smp_processor_id());
>> + crash_save_cpu(®s, smp_processor_id());
>> + flush_cache_all();
>> +
>> + atomic_dec(&waiting_for_crash_ipi);
>> + while (1)
>> + cpu_relax();
>> +}
>> +
>> void machine_crash_shutdown(struct pt_regs *regs)
>> {
>> + unsigned long msecs;
>> +
>> + atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
>> +
>> + local_irq_enable();
>
> I wonder whether it is good idea to enable interrupts here? What
> if we came here from an interrupt handler with interrupts already
> disabled?
>
> I guess you did this because smp_call_function() needs to have
> interrupts enabled, right?
>
> As we still need to make sure that all the secondary CPUs are
> stopped, should we do just something like:
>
> smp_send_stop();
>
> and then in ipi_cpu_stop() we check whether oops_in_progress is set
> and save the cpu state before entering that never-ending loop?
>
> Regards,
> MW
>
This is absolutely true. In kexec case interrupts are enables so you
can use smp_call_function() but in crash dump case interrupts are
disables due place where crash was occur (null pointer deference, bad
memory area or something like that). Enabling interrupts only for
smp_call_function() looks ugly and can be the cause of more serious
bugs. Please add CRASH_DUMP IPI for this,
Best regards,
Maxim.
>> + smp_call_function(machine_crash_nonpanic_core, NULL, false);
>> + msecs = 1000; /* Wait at most a second for the other cpus to stop */
>> + while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
>> + mdelay(1);
>> + msecs--;
>> + }
>> local_irq_disable();
>> crash_save_cpu(regs, smp_processor_id());
>>
>> --
>> 1.7.2.2
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
>
--
Best regards,
Maxim Uvarov
More information about the linux-arm-kernel
mailing list