On Thu, 2013-01-24 at 00:41 +0000, Seiji Aguchi wrote: > [Problem] > There is a scenario which efi_pstore fails to log messages in a panic case. > > - CPUA holds an efi_var->lock in either efivarfs parts > or efi_pstore with interrupt enabled. > - CPUB panics and sends IPI to CPUA in smp_send_stop(). > - CPUA stops with holding the lock. > - CPUB kicks efi_pstore_write() via kmsg_dump(KSMG_DUMP_PANIC) > but it returns without logging messages. > > [Patch Description] > This patch disables an external interruption while holding efivars->lock > as follows. > > In efi_pstore_write() and get_var_data(), spin_lock/spin_unlock is > replaced by spin_lock_irqsave/spin_unlock_irqrestore because they may > be called in an interrupt context. > > In other functions, they are replaced by spin_lock_irq/spin_unlock_irq. > because they are all called from a process context. > > By applying this patch, we can avoid the problem above with > a following senario. > > - CPUA holds an efi_var->lock with interrupt disabled. > - CPUB panics and sends IPI to CPUA in smp_send_stop(). > - CPUA receives the IPI after releasing the lock because it is > disabling interrupt while holding the lock. > - CPUB waits for one sec until CPUA releases the lock. > - CPUB kicks efi_pstore_write() via kmsg_dump(KSMG_DUMP_PANIC) > And it can hold the lock successfully. > > Signed-off-by: Seiji Aguchi <seiji.aguchi@xxxxxxx> > Acked-by: Mike Waychison <mikew@xxxxxxxxxx> > --- > drivers/firmware/efivars.c | 86 ++++++++++++++++++++++--------------------- > 1 files changed, 44 insertions(+), 42 deletions(-) Acked-by: Matt Fleming <matt.fleming@xxxxxxxxx> Tony, are you picking this up? -- Matt Fleming, Intel Open Source Technology Center -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html