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