Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_RATELIMIT_H
0003 #define _LINUX_RATELIMIT_H
0004 
0005 #include <linux/ratelimit_types.h>
0006 #include <linux/sched.h>
0007 #include <linux/spinlock.h>
0008 
0009 static inline void ratelimit_state_init(struct ratelimit_state *rs,
0010                     int interval, int burst)
0011 {
0012     memset(rs, 0, sizeof(*rs));
0013 
0014     raw_spin_lock_init(&rs->lock);
0015     rs->interval    = interval;
0016     rs->burst   = burst;
0017 }
0018 
0019 static inline void ratelimit_default_init(struct ratelimit_state *rs)
0020 {
0021     return ratelimit_state_init(rs, DEFAULT_RATELIMIT_INTERVAL,
0022                     DEFAULT_RATELIMIT_BURST);
0023 }
0024 
0025 static inline void ratelimit_state_exit(struct ratelimit_state *rs)
0026 {
0027     if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
0028         return;
0029 
0030     if (rs->missed) {
0031         pr_warn("%s: %d output lines suppressed due to ratelimiting\n",
0032             current->comm, rs->missed);
0033         rs->missed = 0;
0034     }
0035 }
0036 
0037 static inline void
0038 ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
0039 {
0040     rs->flags = flags;
0041 }
0042 
0043 extern struct ratelimit_state printk_ratelimit_state;
0044 
0045 #ifdef CONFIG_PRINTK
0046 
0047 #define WARN_ON_RATELIMIT(condition, state) ({      \
0048     bool __rtn_cond = !!(condition);            \
0049     WARN_ON(__rtn_cond && __ratelimit(state));      \
0050     __rtn_cond;                     \
0051 })
0052 
0053 #define WARN_RATELIMIT(condition, format, ...)          \
0054 ({                              \
0055     static DEFINE_RATELIMIT_STATE(_rs,          \
0056                       DEFAULT_RATELIMIT_INTERVAL,   \
0057                       DEFAULT_RATELIMIT_BURST); \
0058     int rtn = !!(condition);                \
0059                                 \
0060     if (unlikely(rtn && __ratelimit(&_rs)))         \
0061         WARN(rtn, format, ##__VA_ARGS__);       \
0062                                 \
0063     rtn;                            \
0064 })
0065 
0066 #else
0067 
0068 #define WARN_ON_RATELIMIT(condition, state)         \
0069     WARN_ON(condition)
0070 
0071 #define WARN_RATELIMIT(condition, format, ...)          \
0072 ({                              \
0073     int rtn = WARN(condition, format, ##__VA_ARGS__);   \
0074     rtn;                            \
0075 })
0076 
0077 #endif
0078 
0079 #endif /* _LINUX_RATELIMIT_H */