printk: introduce printk_once()
authorIngo Molnar <mingo@elte.hu>
Thu, 5 Feb 2009 12:45:43 +0000 (13:45 +0100)
committerIngo Molnar <mingo@elte.hu>
Thu, 5 Feb 2009 12:52:29 +0000 (13:52 +0100)
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@elte.hu>
include/linux/kernel.h

index 343df9ef2412393020e90c1ef5227135b3b5a07f..3c183d9864ae5a99faf202a80b31bc7cd257c5ff 100644 (file)
@@ -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);