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)
 {

_