File: /Users/paulross/dev/linux/linux-3.13/include/linux/ratelimit.h

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: