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