From 168ff46a3e7594284ac0ba8d58330dd9f4dfa2e8 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 2 Nov 2006 22:07:16 -0800 Subject: [PATCH] --- yaml --- r: 40659 b: refs/heads/master c: f46c483357c2d87606bbefb511321e3efd4baae0 h: refs/heads/master i: 40657: 36d4c984a28575042a5d92711aa398f5323919c5 40655: 4e09a1c932aa6df4eef41e57840d291514f0cc5f v: v3 --- [refs] | 2 +- trunk/include/linux/kernel.h | 2 ++ trunk/kernel/printk.c | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 4cbc44b1b85c..08e746b308e5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7f6b8876c7e66b0d15af134e2a5b87e55514eb6d +refs/heads/master: f46c483357c2d87606bbefb511321e3efd4baae0 diff --git a/trunk/include/linux/kernel.h b/trunk/include/linux/kernel.h index 80f39cab470a..24b611147adb 100644 --- a/trunk/include/linux/kernel.h +++ b/trunk/include/linux/kernel.h @@ -171,6 +171,8 @@ __attribute_const__ roundup_pow_of_two(unsigned long x) extern int printk_ratelimit(void); extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); +extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, + unsigned int interval_msec); static inline void console_silent(void) { diff --git a/trunk/kernel/printk.c b/trunk/kernel/printk.c index f7d427ef5038..66426552fbfe 100644 --- a/trunk/kernel/printk.c +++ b/trunk/kernel/printk.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -1101,3 +1102,23 @@ int printk_ratelimit(void) printk_ratelimit_burst); } EXPORT_SYMBOL(printk_ratelimit); + +/** + * printk_timed_ratelimit - caller-controlled printk ratelimiting + * @caller_jiffies: pointer to caller's state + * @interval_msecs: minimum interval between prints + * + * printk_timed_ratelimit() returns true if more than @interval_msecs + * milliseconds have elapsed since the last time printk_timed_ratelimit() + * returned true. + */ +bool printk_timed_ratelimit(unsigned long *caller_jiffies, + unsigned int interval_msecs) +{ + if (*caller_jiffies == 0 || time_after(jiffies, *caller_jiffies)) { + *caller_jiffies = jiffies + msecs_to_jiffies(interval_msecs); + return true; + } + return false; +} +EXPORT_SYMBOL(printk_timed_ratelimit);