| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 | #ifndef _LINUX_RATELIMIT_TYPES_H | 
|---|
| 3 | #define _LINUX_RATELIMIT_TYPES_H | 
|---|
| 4 |  | 
|---|
| 5 | #include <linux/bits.h> | 
|---|
| 6 | #include <linux/param.h> | 
|---|
| 7 | #include <linux/spinlock_types_raw.h> | 
|---|
| 8 |  | 
|---|
| 9 | #define DEFAULT_RATELIMIT_INTERVAL	(5 * HZ) | 
|---|
| 10 | #define DEFAULT_RATELIMIT_BURST		10 | 
|---|
| 11 |  | 
|---|
| 12 | /* issue num suppressed message on exit */ | 
|---|
| 13 | #define RATELIMIT_MSG_ON_RELEASE	BIT(0) | 
|---|
| 14 | #define RATELIMIT_INITIALIZED		BIT(1) | 
|---|
| 15 |  | 
|---|
| 16 | struct ratelimit_state { | 
|---|
| 17 | raw_spinlock_t	lock;		/* protect the state */ | 
|---|
| 18 |  | 
|---|
| 19 | int		interval; | 
|---|
| 20 | int		burst; | 
|---|
| 21 | atomic_t	rs_n_left; | 
|---|
| 22 | atomic_t	missed; | 
|---|
| 23 | unsigned int	flags; | 
|---|
| 24 | unsigned long	begin; | 
|---|
| 25 | }; | 
|---|
| 26 |  | 
|---|
| 27 | #define RATELIMIT_STATE_INIT_FLAGS(name, interval_init, burst_init, flags_init) { \ | 
|---|
| 28 | .lock		= __RAW_SPIN_LOCK_UNLOCKED(name.lock),		  \ | 
|---|
| 29 | .interval	= interval_init,				  \ | 
|---|
| 30 | .burst		= burst_init,					  \ | 
|---|
| 31 | .flags		= flags_init,					  \ | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | #define RATELIMIT_STATE_INIT(name, interval_init, burst_init) \ | 
|---|
| 35 | RATELIMIT_STATE_INIT_FLAGS(name, interval_init, burst_init, 0) | 
|---|
| 36 |  | 
|---|
| 37 | #define RATELIMIT_STATE_INIT_DISABLED					\ | 
|---|
| 38 | RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST) | 
|---|
| 39 |  | 
|---|
| 40 | #define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init)		\ | 
|---|
| 41 | \ | 
|---|
| 42 | struct ratelimit_state name =					\ | 
|---|
| 43 | RATELIMIT_STATE_INIT(name, interval_init, burst_init)	\ | 
|---|
| 44 |  | 
|---|
| 45 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); | 
|---|
| 46 | #define __ratelimit(state) ___ratelimit(state, __func__) | 
|---|
| 47 |  | 
|---|
| 48 | #endif /* _LINUX_RATELIMIT_TYPES_H */ | 
|---|
| 49 |  | 
|---|