]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - c_src/linux/ratelimit.c
move Rust sources to top level, C sources into c_src
[bcachefs-tools-debian] / c_src / linux / ratelimit.c
diff --git a/c_src/linux/ratelimit.c b/c_src/linux/ratelimit.c
new file mode 100644 (file)
index 0000000..21a6d6c
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ratelimit.c - Do something with rate limit.
+ *
+ * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com>
+ *
+ * 2008-05-01 rewrite the function and use a ratelimit_state data struct as
+ * parameter. Now every user can use their own standalone ratelimit_state.
+ */
+
+#include <linux/ratelimit.h>
+#include <linux/jiffies.h>
+#include <linux/export.h>
+
+/*
+ * __ratelimit - rate limiting
+ * @rs: ratelimit_state data
+ * @func: name of calling function
+ *
+ * This enforces a rate limit: not more than @rs->burst callbacks
+ * in every @rs->interval
+ *
+ * RETURNS:
+ * 0 means callbacks will be suppressed.
+ * 1 means go ahead and do it.
+ */
+int ___ratelimit(struct ratelimit_state *rs, const char *func)
+{
+       int ret;
+
+       if (!rs->interval)
+               return 1;
+
+       /*
+        * If we contend on this state's lock then almost
+        * by definition we are too busy to print a message,
+        * in addition to the one that will be printed by
+        * the entity that is holding the lock already:
+        */
+       if (!raw_spin_trylock(&rs->lock))
+               return 0;
+
+       if (!rs->begin)
+               rs->begin = jiffies;
+
+       if (time_is_before_jiffies(rs->begin + rs->interval)) {
+               if (rs->missed) {
+                       if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
+                               printk(KERN_WARNING
+                                      "%s: %d callbacks suppressed\n",
+                                      func, rs->missed);
+                               rs->missed = 0;
+                       }
+               }
+               rs->begin   = jiffies;
+               rs->printed = 0;
+       }
+       if (rs->burst && rs->burst > rs->printed) {
+               rs->printed++;
+               ret = 1;
+       } else {
+               rs->missed++;
+               ret = 0;
+       }
+       raw_spin_unlock(&rs->lock);
+
+       return ret;
+}
+EXPORT_SYMBOL(___ratelimit);