From: Frank Seidel <fr...@f-seidel.de> Reduce stack memory footprint in ipmi_msghandler for send_panic_events. (From 992 bytes on i386 down to below 100)
Signed-off-by: Frank Seidel <fr...@f-seidel.de> --- 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 Openipmi-developer@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openipmi-developer