Branch data Line data Source code
1 : : #ifndef _LINUX_RATELIMIT_H
2 : : #define _LINUX_RATELIMIT_H
3 : :
4 : : #include <linux/param.h>
5 : : #include <linux/spinlock.h>
6 : :
7 : : #define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
8 : : #define DEFAULT_RATELIMIT_BURST 10
9 : :
10 : : struct ratelimit_state {
11 : : raw_spinlock_t lock; /* protect the state */
12 : :
13 : : int interval;
14 : : int burst;
15 : : int printed;
16 : : int missed;
17 : : unsigned long begin;
18 : : };
19 : :
20 : : #define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
21 : : \
22 : : struct ratelimit_state name = { \
23 : : .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
24 : : .interval = interval_init, \
25 : : .burst = burst_init, \
26 : : }
27 : :
28 : : static inline void ratelimit_state_init(struct ratelimit_state *rs,
29 : : int interval, int burst)
30 : : {
31 : 0 : raw_spin_lock_init(&rs->lock);
32 : 0 : rs->interval = interval;
33 : 0 : rs->burst = burst;
34 : 0 : rs->printed = 0;
35 : 0 : rs->missed = 0;
36 : 0 : rs->begin = 0;
37 : : }
38 : :
39 : : extern struct ratelimit_state printk_ratelimit_state;
40 : :
41 : : extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
42 : : #define __ratelimit(state) ___ratelimit(state, __func__)
43 : :
44 : : #ifdef CONFIG_PRINTK
45 : :
46 : : #define WARN_ON_RATELIMIT(condition, state) \
47 : : WARN_ON((condition) && __ratelimit(state))
48 : :
49 : : #define WARN_RATELIMIT(condition, format, ...) \
50 : : ({ \
51 : : static DEFINE_RATELIMIT_STATE(_rs, \
52 : : DEFAULT_RATELIMIT_INTERVAL, \
53 : : DEFAULT_RATELIMIT_BURST); \
54 : : int rtn = !!(condition); \
55 : : \
56 : : if (unlikely(rtn && __ratelimit(&_rs))) \
57 : : WARN(rtn, format, ##__VA_ARGS__); \
58 : : \
59 : : rtn; \
60 : : })
61 : :
62 : : #else
63 : :
64 : : #define WARN_ON_RATELIMIT(condition, state) \
65 : : WARN_ON(condition)
66 : :
67 : : #define WARN_RATELIMIT(condition, format, ...) \
68 : : ({ \
69 : : int rtn = WARN(condition, format, ##__VA_ARGS__); \
70 : : rtn; \
71 : : })
72 : :
73 : : #endif
74 : :
75 : : #endif /* _LINUX_RATELIMIT_H */
|