All of lore.kernel.org
 help / color / mirror / Atom feed
From: Corey Minyard <minyard@acm.org>
To: Frank Seidel <fseidel@suse.de>
Cc: linux kernel <linux-kernel@vger.kernel.org>,
	akpm@linux-foundation.org,
	openipmi-developer@lists.sourceforge.net, kernalert.de@gmail.com,
	djwong@us.ibm.com, Adrian Bunk <bunk@kernel.org>,
	Alexey Dobriyan <adobriyan@gmail.com>,
	cminyard@mvista.com, kbaidarov@ru.mvista.com, crquan@gmail.com
Subject: Re: [PATCH] ipmi: reduce stack size of msghandler
Date: Wed, 04 Mar 2009 08:59:13 -0600	[thread overview]
Message-ID: <49AE9741.9030109@acm.org> (raw)
In-Reply-To: <49AE7274.2080206@suse.de>

Frank Seidel wrote:
> From: Frank Seidel <frank@f-seidel.de>
>
> 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 <frank@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 */
>  
>
>   


      reply	other threads:[~2009-03-04 14:59 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-04 12:22 [PATCH] ipmi: reduce stack size of msghandler Frank Seidel
2009-03-04 14:59 ` Corey Minyard [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49AE9741.9030109@acm.org \
    --to=minyard@acm.org \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=bunk@kernel.org \
    --cc=cminyard@mvista.com \
    --cc=crquan@gmail.com \
    --cc=djwong@us.ibm.com \
    --cc=fseidel@suse.de \
    --cc=kbaidarov@ru.mvista.com \
    --cc=kernalert.de@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=openipmi-developer@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.