LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Dave Young <hidave.darkstar@gmail.com>
Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Subject: Re: [PATCH RFC] [1/3] isolate ratelimit from printk.c for other use
Date: Mon, 10 Mar 2008 12:05:46 -0700	[thread overview]
Message-ID: <20080310190546.GC11568@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080310063115.GA6745@darkstar.te-china.tietoenator.com>

On Mon, Mar 10, 2008 at 02:31:15PM +0800, Dave Young wrote:
> This series include 3 patch, they need to be applied in order.
> 1) isolate ratelimit from printk.c
> 2) add WARN_ON_SECS macro
> 3) use WARN_ON_SECS macro in rcupreempt.h
> 
> Please give some comments and suggestions for improvement, thanks.

Works for me -- high-rate warnings are limited to one per ten seconds,
with 10s of thousands of suppressed messages, as expected.  It would
of course be good to fix the typo called out by Randy.

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Tested-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

> ---
> 
> 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>
> 
> ---
> include/linux/kernel.h |    1 
> kernel/printk.c        |   26 ------------------------
> lib/Makefile           |    2 -
> lib/ratelimit.c        |   51 +++++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 54 insertions(+), 26 deletions(-)
> 
> diff -uprN linux/include/linux/kernel.h linux.new/include/linux/kernel.h
> --- linux/include/linux/kernel.h	2008-03-10 13:41:18.000000000 +0800
> +++ linux.new/include/linux/kernel.h	2008-03-10 13:42:06.000000000 +0800
> @@ -188,6 +188,7 @@ extern int log_buf_copy(char *dest, int 
>  extern int printk_ratelimit_jiffies;
>  extern int printk_ratelimit_burst;
>  extern int printk_ratelimit(void);
> +extern int __ratelimit(int ratelimit_jiffies, int ratelimit_burst);
>  extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst);
>  extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
>  				   unsigned int interval_msec);
> diff -uprN linux/kernel/printk.c linux.new/kernel/printk.c
> --- linux/kernel/printk.c	2008-03-10 13:41:37.000000000 +0800
> +++ linux.new/kernel/printk.c	2008-03-10 13:42:19.000000000 +0800
> @@ -1261,31 +1261,7 @@ void tty_write_message(struct tty_struct
>   */
>  int __printk_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 "printk: %d messages suppressed.\n", lost);
> -		return 1;
> -	}
> -	missed++;
> -	spin_unlock_irqrestore(&ratelimit_lock, flags);
> -	return 0;
> +	return __ratelimit(ratelimit_jiffies, ratelimit_burst);
>  }
>  EXPORT_SYMBOL(__printk_ratelimit);
> 
> diff -uprN linux/lib/Makefile linux.new/lib/Makefile
> --- linux/lib/Makefile	2008-03-10 13:43:57.000000000 +0800
> +++ linux.new/lib/Makefile	2008-03-10 13:42:38.000000000 +0800
> @@ -6,7 +6,7 @@ lib-y := ctype.o string.o vsprintf.o cmd
>  	 rbtree.o radix-tree.o dump_stack.o \
>  	 idr.o int_sqrt.o extable.o prio_tree.o \
>  	 sha1.o irq_regs.o reciprocal_div.o argv_split.o \
> -	 proportions.o prio_heap.o
> +	 proportions.o prio_heap.o ratelimit.o
> 
>  lib-$(CONFIG_MMU) += ioremap.o
>  lib-$(CONFIG_SMP) += cpumask.o
> diff -uprN linux/lib/ratelimit.c linux.new/lib/ratelimit.c
> --- linux/lib/ratelimit.c	1970-01-01 07:00:00.000000000 +0700
> +++ linux.new/lib/ratelimit.c	2008-03-10 13:42:46.000000000 +0800
> @@ -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 too 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 "__ratelimit: %d messages"
> +				" suppressed.\n", lost);
> +		return 1;
> +	}
> +	missed++;
> +	spin_unlock_irqrestore(&ratelimit_lock, flags);
> +	return 0;
> +}
> +EXPORT_SYMBOL(__ratelimit);

      parent reply	other threads:[~2008-03-10 19:06 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-10  6:31 Dave Young
2008-03-10 15:51 ` Randy Dunlap
2008-03-11  1:16   ` Dave Young
2008-03-10 19:05 ` Paul E. McKenney [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080310190546.GC11568@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=hidave.darkstar@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --subject='Re: [PATCH RFC] [1/3] isolate ratelimit from printk.c for other use' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).