[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(&regs, NULL);
>> +     printk(KERN_EMERG "CPU %u will stop doing anything useful since another CPU has crashed\n",
>> +            smp_processor_id());
>> +     crash_save_cpu(&regs, 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