Skip to content

Commit

Permalink
printk: Make linux/printk.h self-contained
Browse files Browse the repository at this point in the history
As it stands if you include printk.h 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.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
herbertx authored and intel-lab-lkp committed Jun 11, 2020
1 parent b29482f commit 17b4184
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 35 deletions.
1 change: 1 addition & 0 deletions include/linux/printk.h
Expand Up @@ -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[];
Expand Down
36 changes: 1 addition & 35 deletions include/linux/ratelimit.h
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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) ({ \
Expand Down
43 changes: 43 additions & 0 deletions include/linux/ratelimit_types.h
@@ -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 */

0 comments on commit 17b4184

Please sign in to comment.