|
@@ -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);
|