Merge branch 'work.const-qstr' into work.misc
[cascardo/linux.git] / include / linux / ratelimit.h
index 1810252..57c9e06 100644 (file)
@@ -2,11 +2,15 @@
 #define _LINUX_RATELIMIT_H
 
 #include <linux/param.h>
+#include <linux/sched.h>
 #include <linux/spinlock.h>
 
 #define DEFAULT_RATELIMIT_INTERVAL     (5 * HZ)
 #define DEFAULT_RATELIMIT_BURST                10
 
+/* issue num suppressed message on exit */
+#define RATELIMIT_MSG_ON_RELEASE       BIT(0)
+
 struct ratelimit_state {
        raw_spinlock_t  lock;           /* protect the state */
 
@@ -15,6 +19,7 @@ struct ratelimit_state {
        int             printed;
        int             missed;
        unsigned long   begin;
+       unsigned long   flags;
 };
 
 #define RATELIMIT_STATE_INIT(name, interval_init, burst_init) {                \
@@ -34,12 +39,35 @@ struct ratelimit_state {
 static inline void ratelimit_state_init(struct ratelimit_state *rs,
                                        int interval, int burst)
 {
+       memset(rs, 0, sizeof(*rs));
+
        raw_spin_lock_init(&rs->lock);
-       rs->interval = interval;
-       rs->burst = burst;
-       rs->printed = 0;
-       rs->missed = 0;
-       rs->begin = 0;
+       rs->interval    = interval;
+       rs->burst       = burst;
+}
+
+static inline void ratelimit_default_init(struct ratelimit_state *rs)
+{
+       return ratelimit_state_init(rs, DEFAULT_RATELIMIT_INTERVAL,
+                                       DEFAULT_RATELIMIT_BURST);
+}
+
+static inline void ratelimit_state_exit(struct ratelimit_state *rs)
+{
+       if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE))
+               return;
+
+       if (rs->missed) {
+               pr_warn("%s: %d output lines suppressed due to ratelimiting\n",
+                       current->comm, rs->missed);
+               rs->missed = 0;
+       }
+}
+
+static inline void
+ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
+{
+       rs->flags = flags;
 }
 
 extern struct ratelimit_state printk_ratelimit_state;