Reimplement net_ratelimit() in terms of the new printk_ratelimit(). As net_ratelimit() already has it own sysctls we generalise printk_ratelimit() a bit so that networking does not lose its existing sysctls and so that it can use different time constants from the more generic printk_ratelimit(). --- include/linux/kernel.h | 1 + kernel/printk.c | 29 ++++++++++++++++++----------- net/core/utils.c | 30 ++---------------------------- 3 files changed, 21 insertions(+), 39 deletions(-) diff -puN net/core/utils.c~simplify-net_ratelimit net/core/utils.c --- 25/net/core/utils.c~simplify-net_ratelimit 2004-01-19 23:08:29.000000000 -0800 +++ 25-akpm/net/core/utils.c 2004-01-19 23:08:29.000000000 -0800 @@ -41,37 +41,11 @@ int net_msg_cost = 5*HZ; int net_msg_burst = 10*5*HZ; /* - * This enforces a rate limit: not more than one kernel message - * every 5secs to make a denial-of-service attack impossible. - * - * All warning printk()s should be guarded by this function. + * All net warning printk()s should be guarded by this function. */ int net_ratelimit(void) { - static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED; - static unsigned long 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 > net_msg_burst) - toks = net_msg_burst; - if (toks >= net_msg_cost) { - int lost = missed; - missed = 0; - toks -= net_msg_cost; - spin_unlock_irqrestore(&ratelimit_lock, flags); - if (lost) - printk(KERN_WARNING "NET: %d messages suppressed.\n", lost); - return 1; - } - missed++; - spin_unlock_irqrestore(&ratelimit_lock, flags); - return 0; + return __printk_ratelimit(net_msg_cost, net_msg_burst); } EXPORT_SYMBOL(net_random); diff -puN kernel/printk.c~simplify-net_ratelimit kernel/printk.c --- 25/kernel/printk.c~simplify-net_ratelimit 2004-01-19 23:08:29.000000000 -0800 +++ 25-akpm/kernel/printk.c 2004-01-19 23:08:29.000000000 -0800 @@ -784,12 +784,6 @@ void tty_write_message(struct tty_struct return; } -/* minimum time in jiffies between messages */ -int printk_ratelimit_jiffies = 5*HZ; - -/* number of messages we send before ratelimiting */ -int printk_ratelimit_burst = 10; - /* * printk rate limiting, lifted from the networking subsystem. * @@ -797,7 +791,7 @@ int printk_ratelimit_burst = 10; * every printk_ratelimit_jiffies to make a denial-of-service * attack impossible. */ -int printk_ratelimit(void) +int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst) { static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED; static unsigned long toks = 10*5*HZ; @@ -809,12 +803,12 @@ int printk_ratelimit(void) spin_lock_irqsave(&ratelimit_lock, flags); toks += now - last_msg; last_msg = now; - if (toks > (printk_ratelimit_burst * printk_ratelimit_jiffies)) - toks = printk_ratelimit_burst * printk_ratelimit_jiffies; - if (toks >= printk_ratelimit_jiffies) { + if (toks > (ratelimit_burst * ratelimit_jiffies)) + toks = ratelimit_burst * ratelimit_jiffies; + if (toks >= ratelimit_jiffies) { int lost = missed; missed = 0; - toks -= printk_ratelimit_jiffies; + toks -= ratelimit_jiffies; spin_unlock_irqrestore(&ratelimit_lock, flags); if (lost) printk(KERN_WARNING "printk: %d messages suppressed.\n", lost); @@ -824,4 +818,17 @@ int printk_ratelimit(void) spin_unlock_irqrestore(&ratelimit_lock, flags); return 0; } +EXPORT_SYMBOL(__printk_ratelimit); + +/* minimum time in jiffies between messages */ +int printk_ratelimit_jiffies = 5*HZ; + +/* number of messages we send before ratelimiting */ +int printk_ratelimit_burst = 10; + +int printk_ratelimit(void) +{ + return __printk_ratelimit(printk_ratelimit_jiffies, + printk_ratelimit_burst); +} EXPORT_SYMBOL(printk_ratelimit); diff -puN include/linux/kernel.h~simplify-net_ratelimit include/linux/kernel.h --- 25/include/linux/kernel.h~simplify-net_ratelimit 2004-01-19 23:08:29.000000000 -0800 +++ 25-akpm/include/linux/kernel.h 2004-01-19 23:08:29.000000000 -0800 @@ -90,6 +90,7 @@ asmlinkage int printk(const char * fmt, unsigned long int_sqrt(unsigned long); extern int printk_ratelimit(void); +extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); static inline void console_silent(void) { _