From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751452Ab1AEDis (ORCPT ); Tue, 4 Jan 2011 22:38:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:22427 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751078Ab1AEDir (ORCPT ); Tue, 4 Jan 2011 22:38:47 -0500 From: Don Zickus To: Ingo Molnar Cc: akpm@linux-foundation.org, fweisbec@gmail.com, LKML , Don Zickus Subject: [PATCH 1/2] panic: ratelimit panic messages Date: Tue, 4 Jan 2011 22:38:30 -0500 Message-Id: <1294198711-15492-2-git-send-email-dzickus@redhat.com> In-Reply-To: <1294198711-15492-1-git-send-email-dzickus@redhat.com> References: <1294198711-15492-1-git-send-email-dzickus@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sometimes when things go bad, so much spew is coming on the console it is hard to figure out what happened. This patch allows you to ratelimit the panic messages with the intent that the first panic message will provide the info we need to figure out what happened. Adds new kernel param 'panic_ratelimit=on/' Signed-off-by: Don Zickus --- Documentation/kernel-parameters.txt | 6 ++++++ kernel/panic.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 0 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 316c723..1416964 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -1807,6 +1807,12 @@ and is between 256 and 4096 characters. It is defined in the file panic= [KNL] Kernel behaviour on panic Format: + panic_ratelimit= [KNL] ratelimit the panic messages + Useful for slowing down multiple panics to capture + the first one before it scrolls off the screen + Format: "on" or some integer in seconds + "on" defaults to 10 minutes + parkbd.port= [HW] Parallel port number the keyboard adapter is connected to, default is 0. Format: diff --git a/kernel/panic.c b/kernel/panic.c index 4c13b1a..fe89e04 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -23,6 +23,7 @@ #include #include #include +#include #define PANIC_TIMER_STEP 100 #define PANIC_BLINK_SPD 18 @@ -48,6 +49,31 @@ static long no_blink(int state) long (*panic_blink)(int state); EXPORT_SYMBOL(panic_blink); +/* setting default to 0 effectively disables it */ +DEFINE_RATELIMIT_STATE(panic_ratelimit_state, 0, 1); + +static int __init panic_ratelimit_setup(char *str) +{ + int interval; + + if (!strncmp(str, "on", 2)) + /* default to 10 minutes */ + interval = 600 * HZ; + else + interval = simple_strtoul(str, NULL, 0) * HZ; + + panic_ratelimit_state.interval = interval; + return 1; +} +__setup("panic_ratelimit=", panic_ratelimit_setup); + +static int __panic_ratelimit(const char *func) +{ + return ___ratelimit(&panic_ratelimit_state, func); +} + +#define panic_ratelimit() __panic_ratelimit(__func__) + /** * panic - halt the system * @fmt: The text string to print @@ -63,6 +89,10 @@ NORET_TYPE void panic(const char * fmt, ...) long i, i_next = 0; int state = 0; + if (!panic_ratelimit()) + for(;;) + cpu_relax(); + /* * It's possible to come here directly from a panic-assertion and * not have preempt disabled. Some functions called from here want -- 1.7.3.4