summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <dsd@laptop.org>2010-10-20 16:00:48 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2010-10-22 10:20:11 -0700
commitcd3ecad19aea8debae9a48b53de2ec7a571f24e9 (patch)
treefbdb69e372b60cd01daca0c9ea3c8b5ebebb4d00
parent0dd25df1a4e63c078f357aaffb09789c9438378f (diff)
downloadlinux-3.10-cd3ecad19aea8debae9a48b53de2ec7a571f24e9.tar.gz
linux-3.10-cd3ecad19aea8debae9a48b53de2ec7a571f24e9.tar.bz2
linux-3.10-cd3ecad19aea8debae9a48b53de2ec7a571f24e9.zip
serial8250: ratelimit "too much work" error
Running a serial console, if too many kernel messages are generated within a short time causing a lot of serial I/O, the 8250 driver will generate another kernel message reporting this, which just adds to the I/O. It has a cascading effect and quickly results the system being brought to its knees by a flood of "too much work" messages. Ratelimit the error message to avoid this. [akpm@linux-foundation.org: use the superior printk_ratelimited()] [akpm@linux-foundation.org: printk_ratelimited() needs ratelimit.h] Signed-off-by: Daniel Drake <dsd@laptop.org> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/serial/8250.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 37f19a678c9..167c4a6ccbc 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -31,6 +31,7 @@
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/tty.h>
+#include <linux/ratelimit.h>
#include <linux/tty_flip.h>
#include <linux/serial_reg.h>
#include <linux/serial_core.h>
@@ -1600,8 +1601,8 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
if (l == i->head && pass_counter++ > PASS_LIMIT) {
/* If we hit this, we're dead. */
- printk(KERN_ERR "serial8250: too much work for "
- "irq%d\n", irq);
+ printk_ratelimited(KERN_ERR
+ "serial8250: too much work for irq%d\n", irq);
break;
}
} while (l != end);