blob: 35136671b215f68222f498e086248fb8df51e64b [file] [log] [blame]
Dave Young5f97a5a2008-04-29 00:59:43 -07001/*
2 * ratelimit.c - Do something with rate limit.
3 *
4 * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com>
5 *
Dave Young717115e2008-07-25 01:45:58 -07006 * 2008-05-01 rewrite the function and use a ratelimit_state data struct as
7 * parameter. Now every user can use their own standalone ratelimit_state.
8 *
Dave Young5f97a5a2008-04-29 00:59:43 -07009 * This file is released under the GPLv2.
10 *
11 */
12
13#include <linux/kernel.h>
14#include <linux/jiffies.h>
15#include <linux/module.h>
16
Dave Young717115e2008-07-25 01:45:58 -070017static DEFINE_SPINLOCK(ratelimit_lock);
18static unsigned long flags;
19
Dave Young5f97a5a2008-04-29 00:59:43 -070020/*
21 * __ratelimit - rate limiting
Dave Young717115e2008-07-25 01:45:58 -070022 * @rs: ratelimit_state data
Dave Young5f97a5a2008-04-29 00:59:43 -070023 *
Dave Young717115e2008-07-25 01:45:58 -070024 * This enforces a rate limit: not more than @rs->ratelimit_burst callbacks
25 * in every @rs->ratelimit_jiffies
Dave Young5f97a5a2008-04-29 00:59:43 -070026 */
Dave Young717115e2008-07-25 01:45:58 -070027int __ratelimit(struct ratelimit_state *rs)
Dave Young5f97a5a2008-04-29 00:59:43 -070028{
Dave Young717115e2008-07-25 01:45:58 -070029 if (!rs->interval)
30 return 1;
Dave Young5f97a5a2008-04-29 00:59:43 -070031
32 spin_lock_irqsave(&ratelimit_lock, flags);
Dave Young717115e2008-07-25 01:45:58 -070033 if (!rs->begin)
34 rs->begin = jiffies;
Dave Young5f97a5a2008-04-29 00:59:43 -070035
Dave Young717115e2008-07-25 01:45:58 -070036 if (time_is_before_jiffies(rs->begin + rs->interval)) {
37 if (rs->missed)
38 printk(KERN_WARNING "%s: %d callbacks suppressed\n",
39 __func__, rs->missed);
40 rs->begin = 0;
41 rs->printed = 0;
42 rs->missed = 0;
Dave Young5f97a5a2008-04-29 00:59:43 -070043 }
Dave Young717115e2008-07-25 01:45:58 -070044 if (rs->burst && rs->burst > rs->printed)
45 goto print;
46
47 rs->missed++;
Dave Young5f97a5a2008-04-29 00:59:43 -070048 spin_unlock_irqrestore(&ratelimit_lock, flags);
49 return 0;
Dave Young717115e2008-07-25 01:45:58 -070050
51print:
52 rs->printed++;
53 spin_unlock_irqrestore(&ratelimit_lock, flags);
54 return 1;
Dave Young5f97a5a2008-04-29 00:59:43 -070055}
56EXPORT_SYMBOL(__ratelimit);