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, state, format...)           \
  50({                                                              \
  51        int rtn = 0;                                            \
  52        if (unlikely(__ratelimit(state)))                       \
  53                rtn = WARN(condition, format);                  \
  54        rtn;                                                    \
  55})
  56
  57#define WARN_RATELIMIT(condition, format...)                    \
  58({                                                              \
  59        static DEFINE_RATELIMIT_STATE(_rs,                      \
  60                                      DEFAULT_RATELIMIT_INTERVAL,       \
  61                                      DEFAULT_RATELIMIT_BURST); \
  62        __WARN_RATELIMIT(condition, &_rs, format);              \
  63})
  64
  65#else
  66
  67#define WARN_ON_RATELIMIT(condition, state)                     \
  68        WARN_ON(condition)
  69
  70#define __WARN_RATELIMIT(condition, state, format...)           \
  71({                                                              \
  72        int rtn = WARN(condition, format);                      \
  73        rtn;                                                    \
  74})
  75
  76#define WARN_RATELIMIT(condition, format...)                    \
  77({                                                              \
  78        int rtn = WARN(condition, format);                      \
  79        rtn;                                                    \
  80})
  81
  82#endif
  83
  84#endif /* _LINUX_RATELIMIT_H */
  85