Yeah, that's an issue. I was wondering why it has never been reported before, but I realized it would take a very special set of circumstances to make this happen.
I'll get this to Linus and Cc stable kernel today Thanks, -corey On 12/08/2015 11:04 AM, Tony Camuso wrote: > From: Jan Stancek <[email protected]> > > We encountered a panic on boot in ipmi_si on a dell per320 due to an > uninitialized timer as follows. > > static int smi_start_processing(void *send_info, > ipmi_smi_t intf) > { > /* Try to claim any interrupts. */ > if (new_smi->irq_setup) > new_smi->irq_setup(new_smi); > > --> IRQ arrives here and irq handler tries to modify uninitialized timer > > which triggers BUG_ON(!timer->function) in __mod_timer(). > > Call Trace: > <IRQ> > [<ffffffffa0532617>] start_new_msg+0x47/0x80 [ipmi_si] > [<ffffffffa053269e>] start_check_enables+0x4e/0x60 [ipmi_si] > [<ffffffffa0532bd8>] smi_event_handler+0x1e8/0x640 [ipmi_si] > [<ffffffff810f5584>] ? __rcu_process_callbacks+0x54/0x350 > [<ffffffffa053327c>] si_irq_handler+0x3c/0x60 [ipmi_si] > [<ffffffff810efaf0>] handle_IRQ_event+0x60/0x170 > [<ffffffff810f245e>] handle_edge_irq+0xde/0x180 > [<ffffffff8100fc59>] handle_irq+0x49/0xa0 > [<ffffffff8154643c>] do_IRQ+0x6c/0xf0 > [<ffffffff8100ba53>] ret_from_intr+0x0/0x11 > > /* Set up the timer that drives the interface. */ > setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); > > The following patch fixes the problem. > > Signed-off-by: Jan Stancek <[email protected]> > Signed-off-by: Tony Camuso <[email protected]> > --- > drivers/char/ipmi/ipmi_si_intf.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/char/ipmi/ipmi_si_intf.c > b/drivers/char/ipmi/ipmi_si_intf.c > index 55fe902..4cc72fa 100644 > --- a/drivers/char/ipmi/ipmi_si_intf.c > +++ b/drivers/char/ipmi/ipmi_si_intf.c > @@ -1230,14 +1230,14 @@ static int smi_start_processing(void *send_info, > > new_smi->intf = intf; > > - /* Try to claim any interrupts. */ > - if (new_smi->irq_setup) > - new_smi->irq_setup(new_smi); > - > /* Set up the timer that drives the interface. */ > setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); > smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES); > > + /* Try to claim any interrupts. */ > + if (new_smi->irq_setup) > + new_smi->irq_setup(new_smi); > + > /* > * Check if the user forcefully enabled the daemon. > */ ------------------------------------------------------------------------------ _______________________________________________ Openipmi-developer mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openipmi-developer
