Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ratelimit.h
Go to the documentation of this file.
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 
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 {
32  rs->interval = interval;
33  rs->burst = burst;
34  rs->printed = 0;
35  rs->missed = 0;
36  rs->begin = 0;
37 }
38 
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 */