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

Reply via email to