Re: [PATCH 1/4] Net device error logging, revised
From: Jim Keniston <hidden>
Date: 2003-08-26 23:36:35
Also in:
lkml
Greg KH wrote:
On Mon, Aug 25, 2003 at 02:31:19PM -0700, Jim Keniston wrote:quoted
+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