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 { | |
979f693d IM |
11 | spinlock_t lock; /* protect the state */ |
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 = { \ | |
23 | .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ | |
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 | { | |
31 | spin_lock_init(&rs->lock); | |
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 | ||
49 | #define __WARN_RATELIMIT(condition, state, format...) \ | |
50 | ({ \ | |
51 | int rtn = 0; \ | |
52 | if (unlikely(__ratelimit(state))) \ | |
53 | rtn = WARN(condition, format); \ | |
54 | rtn; \ | |
55 | }) | |
56 | ||
57 | #define WARN_RATELIMIT(condition, format...) \ | |
58 | ({ \ | |
59 | static DEFINE_RATELIMIT_STATE(_rs, \ | |
60 | DEFAULT_RATELIMIT_INTERVAL, \ | |
61 | DEFAULT_RATELIMIT_BURST); \ | |
62 | __WARN_RATELIMIT(condition, &_rs, format); \ | |
63 | }) | |
64 | ||
65 | #else | |
66 | ||
67 | #define WARN_ON_RATELIMIT(condition, state) \ | |
68 | WARN_ON(condition) | |
69 | ||
70 | #define __WARN_RATELIMIT(condition, state, format...) \ | |
71 | ({ \ | |
72 | int rtn = WARN(condition, format); \ | |
73 | rtn; \ | |
74 | }) | |
75 | ||
76 | #define WARN_RATELIMIT(condition, format...) \ | |
77 | ({ \ | |
78 | int rtn = WARN(condition, format); \ | |
79 | rtn; \ | |
80 | }) | |
81 | ||
82 | #endif | |
83 | ||
979f693d | 84 | #endif /* _LINUX_RATELIMIT_H */ |