On Thursday 05 February 2009 14:04:20 Ingo Molnar wrote: > > * Ingo Molnar <mingo@xxxxxxx> wrote: > > > printk_once() would be nice indeed - it's a frequent construct. > > Something like the patch below? Yes, nice. Sorry, I can't test it right now, I really have to do something else. I can give it a test in some hours or tomorrow. I'd also wait a week with the WARN_ONCE cleanup until this is in linux-next and then fix it up correctly just "once" :) powernow-k8 printing a backtrace in linux-next in broken BIOS case for a week or two shouldn't be an issue. No need to answer, just tell me if this does not work out. Thanks for your suggestions, Thomas > Ingo > > ----------------> > Author: Ingo Molnar <mingo@xxxxxxx> > AuthorDate: Thu, 5 Feb 2009 13:45:43 +0100 > Commit: Ingo Molnar <mingo@xxxxxxx> > CommitDate: Thu, 5 Feb 2009 13:52:29 +0100 > > printk: introduce printk_once() > > This pattern shows up frequently in the kernel: > > static int once = 1; > ... > > if (once) { > once = 0; > printk(KERN_ERR "message\n"); > } > ... > > So add a printk_once() helper macro that reduces this to a single line > of: > > printk_once(KERN_ERR "message\n"); > > It works analogously to WARN_ONCE() & friends. (We use a macro not > an inline because vararg expansion in inlines looks awkward and the > macro is simple enough.) > > Signed-off-by: Ingo Molnar <mingo@xxxxxxx> > > > --- > include/linux/kernel.h | 17 +++++++++++++++++ > 1 files changed, 17 insertions(+), 0 deletions(-) > > diff --git a/include/linux/kernel.h b/include/linux/kernel.h > index 343df9e..3c183d9 100644 > --- a/include/linux/kernel.h > +++ b/include/linux/kernel.h > @@ -242,6 +242,19 @@ extern struct ratelimit_state printk_ratelimit_state; > extern int printk_ratelimit(void); > extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, > unsigned int interval_msec); > + > +/* > + * Print a one-time message (analogous to WARN_ONCE() et al): > + */ > +#define printk_once(x...) ({ \ > + static int __print_once = 1; \ > + \ > + if (__print_once) { \ > + __print_once = 0; \ > + printk(x); \ > + } \ > +}) > + > #else > static inline int vprintk(const char *s, va_list args) > __attribute__ ((format (printf, 1, 0))); > @@ -253,6 +266,10 @@ static inline int printk_ratelimit(void) { return 0; } > static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \ > unsigned int interval_msec) \ > { return false; } > + > +/* No effect, but we still get type checking even in the !PRINTK case: */ > +#define printk_once(x...) printk(x) > + > #endif > > extern int printk_needs_cpu(int cpu); > -- > To unsubscribe from this list: send the line "unsubscribe cpufreq" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-next" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html