mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-03 19:55:31 +00:00
979f693def
I'd like to use printk_ratelimit() in atomic context, but that's
not possible right now due to the spinlock usage this commit
introduced more than a year ago:
717115e
: printk ratelimiting rewrite
As a first step push the lock into the ratelimit state structure.
This allows us to deal with locking failures to be considered as an
event related to that state being too busy.
Also clean up the code a bit (without changing functionality):
- tidy up the definitions
- clean up the code flow
This also shrinks the code a tiny bit:
text data bss dec hex filename
264 0 4 268 10c ratelimit.o.before
255 0 0 255 ff ratelimit.o.after
( Whole-kernel data size got a bit larger, because we have
two ratelimit-state data structures right now. )
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David S. Miller <davem@davemloft.net>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
/*
|
|
* 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.
|
|
*
|
|
* This file is released under the GPLv2.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/jiffies.h>
|
|
#include <linux/module.h>
|
|
|
|
/*
|
|
* __ratelimit - rate limiting
|
|
* @rs: ratelimit_state data
|
|
*
|
|
* This enforces a rate limit: not more than @rs->ratelimit_burst callbacks
|
|
* in every @rs->ratelimit_jiffies
|
|
*/
|
|
int __ratelimit(struct ratelimit_state *rs)
|
|
{
|
|
unsigned long flags;
|
|
int ret;
|
|
|
|
if (!rs->interval)
|
|
return 1;
|
|
|
|
spin_lock_irqsave(&rs->lock, flags);
|
|
if (!rs->begin)
|
|
rs->begin = jiffies;
|
|
|
|
if (time_is_before_jiffies(rs->begin + rs->interval)) {
|
|
if (rs->missed)
|
|
printk(KERN_WARNING "%s: %d callbacks suppressed\n",
|
|
__func__, rs->missed);
|
|
rs->begin = 0;
|
|
rs->printed = 0;
|
|
rs->missed = 0;
|
|
}
|
|
if (rs->burst && rs->burst > rs->printed) {
|
|
rs->printed++;
|
|
ret = 1;
|
|
} else {
|
|
rs->missed++;
|
|
ret = 0;
|
|
}
|
|
spin_unlock_irqrestore(&rs->lock, flags);
|
|
|
|
return ret;
|
|
}
|
|
EXPORT_SYMBOL(__ratelimit);
|