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