Frank Seidel wrote:
> From: Frank Seidel <[email protected]>
>
> Reduce stack memory footprint in ipmi_msghandler
> for send_panic_events. (From 992 bytes on i386
> down to below 100)
>   
I'm not sure this is a good idea.  This only occurs in a panic
situation, so it may be best to not dynamically allocate memory.

However, 992 bytes is a big chunk of data to swallow on the stack, even
on a panic.  What may be best here is to use static data for this
operation, then use an atomic to control access to the static data.  I
believe an atomic is better than a lock because it avoids problems with
possible re-entrancy with another panic on the same CPU.

Thanks,

-corey

> Signed-off-by: Frank Seidel <[email protected]>
> ---
>  drivers/char/ipmi/ipmi_msghandler.c |   39 
> ++++++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 12 deletions(-)
>
> --- a/drivers/char/ipmi/ipmi_msghandler.c
> +++ b/drivers/char/ipmi/ipmi_msghandler.c
> @@ -4001,8 +4001,20 @@ static void send_panic_events(char *str)
>       unsigned char                     data[16];
>       struct ipmi_system_interface_addr *si;
>       struct ipmi_addr                  addr;
> -     struct ipmi_smi_msg               smi_msg;
> -     struct ipmi_recv_msg              recv_msg;
> +     struct ipmi_smi_msg               *smi_msg;
> +     struct ipmi_recv_msg              *recv_msg;
> +
> +     smi_msg = kmalloc(sizeof(*smi_msg), GFP_KERNEL);
> +     recv_msg = kmalloc(sizeof(*recv_msg), GFP_KERNEL);
> +
> +     if (!smi_msg || !recv_msg) {
> +             printk(KERN_ERR PFX "Could not allocate memory\n");
> +             if (smi_msg)
> +                     kfree(smi_msg);
> +             else if (recv_msg)
> +                     kfree(recv_msg);
> +             return;
> +     }
>  
>       si = (struct ipmi_system_interface_addr *) &addr;
>       si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
> @@ -4030,8 +4042,8 @@ static void send_panic_events(char *str)
>               data[7] = str[2];
>       }
>  
> -     smi_msg.done = dummy_smi_done_handler;
> -     recv_msg.done = dummy_recv_done_handler;
> +     smi_msg->done = dummy_smi_done_handler;
> +     recv_msg->done = dummy_recv_done_handler;
>  
>       /* For every registered interface, send the event. */
>       list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
> @@ -4048,8 +4060,8 @@ static void send_panic_events(char *str)
>                              0,
>                              &msg,
>                              intf,
> -                            &smi_msg,
> -                            &recv_msg,
> +                            smi_msg,
> +                            recv_msg,
>                              0,
>                              intf->channels[0].address,
>                              intf->channels[0].lun,
> @@ -4107,8 +4119,8 @@ static void send_panic_events(char *str)
>                              0,
>                              &msg,
>                              intf,
> -                            &smi_msg,
> -                            &recv_msg,
> +                            smi_msg,
> +                            recv_msg,
>                              0,
>                              intf->channels[0].address,
>                              intf->channels[0].lun,
> @@ -4127,8 +4139,8 @@ static void send_panic_events(char *str)
>                                      0,
>                                      &msg,
>                                      intf,
> -                                    &smi_msg,
> -                                    &recv_msg,
> +                                    smi_msg,
> +                                    recv_msg,
>                                      0,
>                                      intf->channels[0].address,
>                                      intf->channels[0].lun,
> @@ -4195,8 +4207,8 @@ static void send_panic_events(char *str)
>                                      0,
>                                      &msg,
>                                      intf,
> -                                    &smi_msg,
> -                                    &recv_msg,
> +                                    smi_msg,
> +                                    recv_msg,
>                                      0,
>                                      intf->channels[0].address,
>                                      intf->channels[0].lun,
> @@ -4204,6 +4216,9 @@ static void send_panic_events(char *str)
>               }
>       }
>  #endif /* CONFIG_IPMI_PANIC_STRING */
> +
> +     kfree(smi_msg);
> +     kfree(recv_msg);
>  }
>  #endif /* CONFIG_IPMI_PANIC_EVENT */
>  
>
>   


------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to