printk: Make linux/printk.h self-contained
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 21 Jul 2020 06:22:48 +0000 (16:22 +1000)
committerSergey Senozhatsky <sergey.senozhatsky@gmail.com>
Mon, 27 Jul 2020 08:46:24 +0000 (17:46 +0900)
As it stands if you include printk.h by itself it will fail to
compile because it requires definitions from ratelimit.h.  However,
simply including ratelimit.h from printk.h does not work due to
inclusion loops involving sched.h and kernel.h.

This patch solves this by moving bits from ratelimit.h into a new
header file which can then be included by printk.h without any
worries about header loops.

The build bot then revealed some intriguing failures arising out
of this patch.  On s390 there is an inclusion loop with asm/bug.h
and linux/kernel.h that triggers a compile failure, because kernel.h
will cause asm-generic/bug.h to be included before s390's own
asm/bug.h has finished processing.  This has been fixed by not
including kernel.h in arch/s390/include/asm/bug.h.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Acked-by: Petr Mladek <pmladek@suse.com>
Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Link: https://lore.kernel.org/r/20200721062248.GA18383@gondor.apana.org.au
arch/s390/include/asm/bug.h
include/linux/printk.h
include/linux/ratelimit.h
include/linux/ratelimit_types.h [new file with mode: 0644]

index 7725f80..0b25f28 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef _ASM_S390_BUG_H
 #define _ASM_S390_BUG_H
 
-#include <linux/kernel.h>
+#include <linux/compiler.h>
 
 #ifdef CONFIG_BUG
 
index fc8f03c..34c1a7b 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/kern_levels.h>
 #include <linux/linkage.h>
 #include <linux/cache.h>
+#include <linux/ratelimit_types.h>
 
 extern const char linux_banner[];
 extern const char linux_proc_banner[];
index 8ddf79e..b17e0cd 100644 (file)
@@ -2,41 +2,10 @@
 #ifndef _LINUX_RATELIMIT_H
 #define _LINUX_RATELIMIT_H
 
-#include <linux/param.h>
+#include <linux/ratelimit_types.h>
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 
-#define DEFAULT_RATELIMIT_INTERVAL     (5 * HZ)
-#define DEFAULT_RATELIMIT_BURST                10
-
-/* issue num suppressed message on exit */
-#define RATELIMIT_MSG_ON_RELEASE       BIT(0)
-
-struct ratelimit_state {
-       raw_spinlock_t  lock;           /* protect the state */
-
-       int             interval;
-       int             burst;
-       int             printed;
-       int             missed;
-       unsigned long   begin;
-       unsigned long   flags;
-};
-
-#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) {                \
-               .lock           = __RAW_SPIN_LOCK_UNLOCKED(name.lock),  \
-               .interval       = interval_init,                        \
-               .burst          = burst_init,                           \
-       }
-
-#define RATELIMIT_STATE_INIT_DISABLED                                  \
-       RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST)
-
-#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init)                \
-                                                                       \
-       struct ratelimit_state name =                                   \
-               RATELIMIT_STATE_INIT(name, interval_init, burst_init)   \
-
 static inline void ratelimit_state_init(struct ratelimit_state *rs,
                                        int interval, int burst)
 {
@@ -73,9 +42,6 @@ ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
 
 extern struct ratelimit_state printk_ratelimit_state;
 
-extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
-#define __ratelimit(state) ___ratelimit(state, __func__)
-
 #ifdef CONFIG_PRINTK
 
 #define WARN_ON_RATELIMIT(condition, state)    ({              \
diff --git a/include/linux/ratelimit_types.h b/include/linux/ratelimit_types.h
new file mode 100644 (file)
index 0000000..b676aa4
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_RATELIMIT_TYPES_H
+#define _LINUX_RATELIMIT_TYPES_H
+
+#include <linux/bits.h>
+#include <linux/param.h>
+#include <linux/spinlock_types.h>
+
+#define DEFAULT_RATELIMIT_INTERVAL     (5 * HZ)
+#define DEFAULT_RATELIMIT_BURST                10
+
+/* issue num suppressed message on exit */
+#define RATELIMIT_MSG_ON_RELEASE       BIT(0)
+
+struct ratelimit_state {
+       raw_spinlock_t  lock;           /* protect the state */
+
+       int             interval;
+       int             burst;
+       int             printed;
+       int             missed;
+       unsigned long   begin;
+       unsigned long   flags;
+};
+
+#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) {                \
+               .lock           = __RAW_SPIN_LOCK_UNLOCKED(name.lock),  \
+               .interval       = interval_init,                        \
+               .burst          = burst_init,                           \
+       }
+
+#define RATELIMIT_STATE_INIT_DISABLED                                  \
+       RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST)
+
+#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init)                \
+                                                                       \
+       struct ratelimit_state name =                                   \
+               RATELIMIT_STATE_INIT(name, interval_init, burst_init)   \
+
+extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
+#define __ratelimit(state) ___ratelimit(state, __func__)
+
+#endif /* _LINUX_RATELIMIT_TYPES_H */