0001
0002 #ifndef _LINUX_RATELIMIT_H
0003 #define _LINUX_RATELIMIT_H
0004
0005 #include <linux/ratelimit_types.h>
0006 #include <linux/sched.h>
0007 #include <linux/spinlock.h>
0008
0009 static inline void ratelimit_state_init(struct ratelimit_state *rs,
0010 int interval, int burst)
0011 {
0012 memset(rs, 0, sizeof(*rs));
0013
0014 raw_spin_lock_init(&rs->lock);
0015 rs->interval = interval;
0016 rs->burst = burst;
0017 }
0018
0019 static inline void ratelimit_default_init(struct ratelimit_state *rs)
0020 {
0021 return ratelimit_state_init(rs, DEFAULT_RATELIMIT_INTERVAL,
0022 DEFAULT_RATELIMIT_BURST);
0023 }
0024
0025 static inline void ratelimit_state_exit(struct ratelimit_state *rs)
0026 {
0027 if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
0028 return;
0029
0030 if (rs->missed) {
0031 pr_warn("%s: %d output lines suppressed due to ratelimiting\n",
0032 current->comm, rs->missed);
0033 rs->missed = 0;
0034 }
0035 }
0036
0037 static inline void
0038 ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
0039 {
0040 rs->flags = flags;
0041 }
0042
0043 extern struct ratelimit_state printk_ratelimit_state;
0044
0045 #ifdef CONFIG_PRINTK
0046
0047 #define WARN_ON_RATELIMIT(condition, state) ({ \
0048 bool __rtn_cond = !!(condition); \
0049 WARN_ON(__rtn_cond && __ratelimit(state)); \
0050 __rtn_cond; \
0051 })
0052
0053 #define WARN_RATELIMIT(condition, format, ...) \
0054 ({ \
0055 static DEFINE_RATELIMIT_STATE(_rs, \
0056 DEFAULT_RATELIMIT_INTERVAL, \
0057 DEFAULT_RATELIMIT_BURST); \
0058 int rtn = !!(condition); \
0059 \
0060 if (unlikely(rtn && __ratelimit(&_rs))) \
0061 WARN(rtn, format, ##__VA_ARGS__); \
0062 \
0063 rtn; \
0064 })
0065
0066 #else
0067
0068 #define WARN_ON_RATELIMIT(condition, state) \
0069 WARN_ON(condition)
0070
0071 #define WARN_RATELIMIT(condition, format, ...) \
0072 ({ \
0073 int rtn = WARN(condition, format, ##__VA_ARGS__); \
0074 rtn; \
0075 })
0076
0077 #endif
0078
0079 #endif