Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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: raw_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: 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 */ 76: