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

Reply via email to