linux/include/linux/ratelimit.h
<<
>>
Prefs
   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
  10struct 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
  28static 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
  39extern struct ratelimit_state printk_ratelimit_state;
  40
  41extern 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