On 27.04.2009 19:48, Patrick Georgi wrote:
Hi,
the attached patch make printk_* behaviour more consistent. Without it, side effects in the arguments (eg. a pci config read, or variable increment) "vanish" with the message, and the behaviour changes.
Ouch. Great find!
Example: printk_info("foo %d\n", i++);
Without this patch, this becomes (for suitable loglevels) do {} while (0)
With this patch, this will be: do_printk(EMERG, "", i++);
Some of these effects might be unwanted, but at least they are consistent now. For example, via c7 CAR failed for loglevel > 7 for various reasons (patch upcoming). While it fails all the time now (this patch is no "magic fix"), upcoming development is less likely to produce such "hidden surprises".
To reduce the memory footprint slightly, the formatted strings are discarded. A simpler patch would be to just kill the whole "#if #undef #define #endif"- section, but then a lot of strings that never surface would be compiled in (and I doubt the compiler is clever enough to figure that out)
Signed-off-by: Patrick Georgi patrick.georgi@coresystems.de
Let me propose an alternative which does not have an empty printk call, yet keeps the side effects of all parameters.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c =================================================================== --- LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c (Revision 4217) +++ LinuxBIOSv2-printk_level_side_effects/src/arch/i386/lib/console_printk.c (Arbeitskopie) @@ -13,39 +13,39 @@
#if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_EMERG #undef printk_emerg -#define printk_emerg(fmt, arg...) do {} while(0) +#define printk_emerg(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ALERT #undef printk_alert -#define printk_alert(fmt, arg...) do {} while(0) +#define printk_alert(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_CRIT #undef printk_crit -#define printk_crit(fmt, arg...) do {} while(0) +#define printk_crit(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_ERR #undef printk_err -#define printk_err(fmt, arg...) do {} while(0) +#define printk_err(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_WARNING #undef printk_warning -#define printk_warning(fmt, arg...) do {} while(0) +#define printk_warning(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_NOTICE #undef printk_notice -#define printk_notice(fmt, arg...) do {} while(0) +#define printk_notice(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_INFO #undef printk_info -#define printk_info(fmt, arg...) do {} while(0) +#define printk_info(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_DEBUG #undef printk_debug -#define printk_debug(fmt, arg...) do {} while(0) +#define printk_debug(fmt, arg...) do { arg; } while(0) #endif #if MAXIMUM_CONSOLE_LOGLEVEL <= BIOS_SPEW #undef printk_spew -#define printk_spew(fmt, arg...) do {} while(0) +#define printk_spew(fmt, arg...) do { arg; } while(0) #endif
#define print_emerg(STR) printk_emerg ("%s", (STR))