Blame view

include/linux/ratelimit.h 1.84 KB
717115e1a   Dave Young   printk ratelimiti...
1
2
  #ifndef _LINUX_RATELIMIT_H
  #define _LINUX_RATELIMIT_H
979f693de   Ingo Molnar   ratelimit: Use pe...
3

717115e1a   Dave Young   printk ratelimiti...
4
  #include <linux/param.h>
f40c396a9   OGAWA Hirofumi   ratelimit: add ra...
5
  #include <linux/spinlock.h>
717115e1a   Dave Young   printk ratelimiti...
6

979f693de   Ingo Molnar   ratelimit: Use pe...
7
8
  #define DEFAULT_RATELIMIT_INTERVAL	(5 * HZ)
  #define DEFAULT_RATELIMIT_BURST		10
717115e1a   Dave Young   printk ratelimiti...
9
10
  
  struct ratelimit_state {
07354eb1a   Thomas Gleixner   locking, printk: ...
11
  	raw_spinlock_t	lock;		/* protect the state */
979f693de   Ingo Molnar   ratelimit: Use pe...
12
13
14
15
16
17
  
  	int		interval;
  	int		burst;
  	int		printed;
  	int		missed;
  	unsigned long	begin;
717115e1a   Dave Young   printk ratelimiti...
18
  };
979f693de   Ingo Molnar   ratelimit: Use pe...
19
20
21
  #define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init)		\
  									\
  	struct ratelimit_state name = {					\
07354eb1a   Thomas Gleixner   locking, printk: ...
22
  		.lock		= __RAW_SPIN_LOCK_UNLOCKED(name.lock),	\
979f693de   Ingo Molnar   ratelimit: Use pe...
23
24
25
  		.interval	= interval_init,			\
  		.burst		= burst_init,				\
  	}
717115e1a   Dave Young   printk ratelimiti...
26

f40c396a9   OGAWA Hirofumi   ratelimit: add ra...
27
28
29
  static inline void ratelimit_state_init(struct ratelimit_state *rs,
  					int interval, int burst)
  {
07354eb1a   Thomas Gleixner   locking, printk: ...
30
  	raw_spin_lock_init(&rs->lock);
f40c396a9   OGAWA Hirofumi   ratelimit: add ra...
31
32
33
34
35
36
  	rs->interval = interval;
  	rs->burst = burst;
  	rs->printed = 0;
  	rs->missed = 0;
  	rs->begin = 0;
  }
f5d87d851   Namhyung Kim   printk: declare p...
37
  extern struct ratelimit_state printk_ratelimit_state;
5c8287133   Christian Borntraeger   ratelimit: Make s...
38
39
  extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
  #define __ratelimit(state) ___ratelimit(state, __func__)
979f693de   Ingo Molnar   ratelimit: Use pe...
40

86e4ca66e   David S. Miller   bug.h: Move ratel...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  #ifdef CONFIG_PRINTK
  
  #define WARN_ON_RATELIMIT(condition, state)			\
  		WARN_ON((condition) && __ratelimit(state))
  
  #define __WARN_RATELIMIT(condition, state, format...)		\
  ({								\
  	int rtn = 0;						\
  	if (unlikely(__ratelimit(state)))			\
  		rtn = WARN(condition, format);			\
  	rtn;							\
  })
  
  #define WARN_RATELIMIT(condition, format...)			\
  ({								\
  	static DEFINE_RATELIMIT_STATE(_rs,			\
  				      DEFAULT_RATELIMIT_INTERVAL,	\
  				      DEFAULT_RATELIMIT_BURST);	\
  	__WARN_RATELIMIT(condition, &_rs, format);		\
  })
  
  #else
  
  #define WARN_ON_RATELIMIT(condition, state)			\
  	WARN_ON(condition)
  
  #define __WARN_RATELIMIT(condition, state, format...)		\
  ({								\
  	int rtn = WARN(condition, format);			\
  	rtn;							\
  })
  
  #define WARN_RATELIMIT(condition, format...)			\
  ({								\
  	int rtn = WARN(condition, format);			\
  	rtn;							\
  })
  
  #endif
979f693de   Ingo Molnar   ratelimit: Use pe...
80
  #endif /* _LINUX_RATELIMIT_H */