forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
isolate ratelimit from printk.c for other use
Due to the rcupreempt.h WARN_ON trigged, I got 2G syslog file. For some serious complaining of kernel, we need repeat the warnings, so here I isolate the ratelimit part of printk.c to a standalone file. Signed-off-by: Dave Young <hidave.darkstar@gmail.com> Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information
Showing
4 changed files
with
54 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
* ratelimit.c - Do something with rate limit. | ||
* | ||
* Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com> | ||
* | ||
* This file is released under the GPLv2. | ||
* | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/jiffies.h> | ||
#include <linux/module.h> | ||
|
||
/* | ||
* __ratelimit - rate limiting | ||
* @ratelimit_jiffies: minimum time in jiffies between two callbacks | ||
* @ratelimit_burst: number of callbacks we do before ratelimiting | ||
* | ||
* This enforces a rate limit: not more than @ratelimit_burst callbacks | ||
* in every ratelimit_jiffies | ||
*/ | ||
int __ratelimit(int ratelimit_jiffies, int ratelimit_burst) | ||
{ | ||
static DEFINE_SPINLOCK(ratelimit_lock); | ||
static unsigned toks = 10 * 5 * HZ; | ||
static unsigned long last_msg; | ||
static int missed; | ||
unsigned long flags; | ||
unsigned long now = jiffies; | ||
|
||
spin_lock_irqsave(&ratelimit_lock, flags); | ||
toks += now - last_msg; | ||
last_msg = now; | ||
if (toks > (ratelimit_burst * ratelimit_jiffies)) | ||
toks = ratelimit_burst * ratelimit_jiffies; | ||
if (toks >= ratelimit_jiffies) { | ||
int lost = missed; | ||
|
||
missed = 0; | ||
toks -= ratelimit_jiffies; | ||
spin_unlock_irqrestore(&ratelimit_lock, flags); | ||
if (lost) | ||
printk(KERN_WARNING "%s: %d messages suppressed\n", | ||
__func__, lost); | ||
return 1; | ||
} | ||
missed++; | ||
spin_unlock_irqrestore(&ratelimit_lock, flags); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(__ratelimit); |