Blame view
lib/ratelimit.c
1.26 KB
5f97a5a87
|
1 2 3 4 5 |
/* * ratelimit.c - Do something with rate limit. * * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com> * |
717115e1a
|
6 7 8 |
* 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. * |
5f97a5a87
|
9 10 11 12 13 14 15 |
* This file is released under the GPLv2. * */ #include <linux/kernel.h> #include <linux/jiffies.h> #include <linux/module.h> |
717115e1a
|
16 |
static DEFINE_SPINLOCK(ratelimit_lock); |
717115e1a
|
17 |
|
5f97a5a87
|
18 19 |
/* * __ratelimit - rate limiting |
717115e1a
|
20 |
* @rs: ratelimit_state data |
5f97a5a87
|
21 |
* |
717115e1a
|
22 23 |
* This enforces a rate limit: not more than @rs->ratelimit_burst callbacks * in every @rs->ratelimit_jiffies |
5f97a5a87
|
24 |
*/ |
717115e1a
|
25 |
int __ratelimit(struct ratelimit_state *rs) |
5f97a5a87
|
26 |
{ |
4d9c377c8
|
27 |
unsigned long flags; |
717115e1a
|
28 29 |
if (!rs->interval) return 1; |
5f97a5a87
|
30 31 |
spin_lock_irqsave(&ratelimit_lock, flags); |
717115e1a
|
32 33 |
if (!rs->begin) rs->begin = jiffies; |
5f97a5a87
|
34 |
|
717115e1a
|
35 36 37 38 39 40 41 42 |
if (time_is_before_jiffies(rs->begin + rs->interval)) { if (rs->missed) printk(KERN_WARNING "%s: %d callbacks suppressed ", __func__, rs->missed); rs->begin = 0; rs->printed = 0; rs->missed = 0; |
5f97a5a87
|
43 |
} |
717115e1a
|
44 45 46 47 |
if (rs->burst && rs->burst > rs->printed) goto print; rs->missed++; |
5f97a5a87
|
48 49 |
spin_unlock_irqrestore(&ratelimit_lock, flags); return 0; |
717115e1a
|
50 51 52 53 54 |
print: rs->printed++; spin_unlock_irqrestore(&ratelimit_lock, flags); return 1; |
5f97a5a87
|
55 56 |
} EXPORT_SYMBOL(__ratelimit); |