ratelimit.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #ifndef _LINUX_RATELIMIT_H
  2. #define _LINUX_RATELIMIT_H
  3. #include <linux/param.h>
  4. #include <linux/sched.h>
  5. #include <linux/spinlock.h>
  6. #define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
  7. #define DEFAULT_RATELIMIT_BURST 10
  8. /* issue num suppressed message on exit */
  9. #define RATELIMIT_MSG_ON_RELEASE BIT(0)
  10. struct ratelimit_state {
  11. raw_spinlock_t lock; /* protect the state */
  12. int interval;
  13. int burst;
  14. int printed;
  15. int missed;
  16. unsigned long begin;
  17. unsigned long flags;
  18. };
  19. #define RATELIMIT_STATE_INIT(name, interval_init, burst_init) { \
  20. .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
  21. .interval = interval_init, \
  22. .burst = burst_init, \
  23. }
  24. #define RATELIMIT_STATE_INIT_DISABLED \
  25. RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST)
  26. #define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
  27. \
  28. struct ratelimit_state name = \
  29. RATELIMIT_STATE_INIT(name, interval_init, burst_init) \
  30. static inline void ratelimit_state_init(struct ratelimit_state *rs,
  31. int interval, int burst)
  32. {
  33. memset(rs, 0, sizeof(*rs));
  34. raw_spin_lock_init(&rs->lock);
  35. rs->interval = interval;
  36. rs->burst = burst;
  37. }
  38. static inline void ratelimit_default_init(struct ratelimit_state *rs)
  39. {
  40. return ratelimit_state_init(rs, DEFAULT_RATELIMIT_INTERVAL,
  41. DEFAULT_RATELIMIT_BURST);
  42. }
  43. static inline void ratelimit_state_exit(struct ratelimit_state *rs)
  44. {
  45. if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
  46. return;
  47. if (rs->missed) {
  48. pr_warn("%s: %d output lines suppressed due to ratelimiting\n",
  49. current->comm, rs->missed);
  50. rs->missed = 0;
  51. }
  52. }
  53. static inline void
  54. ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
  55. {
  56. rs->flags = flags;
  57. }
  58. extern struct ratelimit_state printk_ratelimit_state;
  59. extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
  60. #define __ratelimit(state) ___ratelimit(state, __func__)
  61. #ifdef CONFIG_PRINTK
  62. #define WARN_ON_RATELIMIT(condition, state) \
  63. WARN_ON((condition) && __ratelimit(state))
  64. #define WARN_RATELIMIT(condition, format, ...) \
  65. ({ \
  66. static DEFINE_RATELIMIT_STATE(_rs, \
  67. DEFAULT_RATELIMIT_INTERVAL, \
  68. DEFAULT_RATELIMIT_BURST); \
  69. int rtn = !!(condition); \
  70. \
  71. if (unlikely(rtn && __ratelimit(&_rs))) \
  72. WARN(rtn, format, ##__VA_ARGS__); \
  73. \
  74. rtn; \
  75. })
  76. #else
  77. #define WARN_ON_RATELIMIT(condition, state) \
  78. WARN_ON(condition)
  79. #define WARN_RATELIMIT(condition, format, ...) \
  80. ({ \
  81. int rtn = WARN(condition, format, ##__VA_ARGS__); \
  82. rtn; \
  83. })
  84. #endif
  85. #endif /* _LINUX_RATELIMIT_H */