Subject: Re: [PATCH 1/4] Net device error logging, revised

From: Jim Keniston <[email-masked]>
Date: Tue, 26 Aug 2003 16:34:00 -0700

Greg KH wrote:
> 
> On Mon, Aug 25, 2003 at 02:31:19PM -0700, Jim Keniston wrote:
> > +int __netdev_printk(const char *sevlevel, const struct net_device *netdev,
> > +     int msglevel, const char *format, ...)
> > +{
> > +     if (!netdev || !format) {
> > +             return -EINVAL;
> > +     }
> > +     if (msglevel == NETIF_MSG_ALL || (netdev->msg_enable & msglevel)) {
> > +             char msg[512];
> 
> 512 bytes on the stack?  Any way to prevent this from happening?  With
> the push to make the stack even smaller in 2.7, people will not like
> this.
> 
> thanks,
> 
> greg k-h

The following options come to mind:
1. Keep the msg buffer, but make it smaller.  Around 120 bytes would probably be
big enough for the vast majority of messages.  (printk() uses a 1024-byte buffer,
but it's static -- see #2.)

2. Use a big, static buffer, protected by a spinlock.  printk() does this.

3. Do the whole thing in a macro, as in previous proposals.  The size of the macro
expansion could be reduced somewhat by doing the encode-prefix step in a function --
something like:

#define netdev_printk(sevlevel, netdev, msglevel, format, arg...)	\
do {									\
if (NETIF_MSG_##msglevel == NETIF_MSG_ALL || ((netdev)->msg_enable & NETIF_MSG_##msglevel)) {	\
	char pfx[40];							\
	printk(sevlevel "%s: " format , make_netdev_msg_prefix(pfx, netdev) , ## arg);	\
}} while (0)

This would make your code bigger, but not that much bigger for the common case where
the msglevel is omitted (and the 'if(...)' is optimized out).

Jim