2012-06-17 19:52:06 +00:00
|
|
|
From 7d9e133200b0dfb736bcf8e511c2231466063fcd Mon Sep 17 00:00:00 2001
|
2011-11-20 00:01:55 +00:00
|
|
|
From: Jason Wessel <jason.wessel@windriver.com>
|
|
|
|
Date: Thu, 28 Jul 2011 12:42:23 -0500
|
2012-06-17 19:52:06 +00:00
|
|
|
Subject: [225/254] kgdb/serial: Short term workaround
|
2011-11-20 00:01:55 +00:00
|
|
|
|
|
|
|
On 07/27/2011 04:37 PM, Thomas Gleixner wrote:
|
|
|
|
> - KGDB (not yet disabled) is reportedly unusable on -rt right now due
|
|
|
|
> to missing hacks in the console locking which I dropped on purpose.
|
|
|
|
>
|
|
|
|
|
|
|
|
To work around this in the short term you can use this patch, in
|
|
|
|
addition to the clocksource watchdog patch that Thomas brewed up.
|
|
|
|
|
|
|
|
Comments are welcome of course. Ultimately the right solution is to
|
|
|
|
change separation between the console and the HW to have a polled mode
|
|
|
|
+ work queue so as not to introduce any kind of latency.
|
|
|
|
|
|
|
|
Thanks,
|
|
|
|
Jason.
|
|
|
|
---
|
2012-06-04 21:20:09 +00:00
|
|
|
drivers/tty/serial/8250/8250.c | 3 ++-
|
|
|
|
include/linux/kdb.h | 2 ++
|
|
|
|
kernel/debug/kdb/kdb_io.c | 6 ++----
|
|
|
|
3 files changed, 6 insertions(+), 5 deletions(-)
|
2011-11-20 00:01:55 +00:00
|
|
|
|
2012-06-17 19:52:06 +00:00
|
|
|
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c
|
|
|
|
index a785ec0..0db379e 100644
|
|
|
|
--- a/drivers/tty/serial/8250/8250.c
|
|
|
|
+++ b/drivers/tty/serial/8250/8250.c
|
2011-11-20 00:01:55 +00:00
|
|
|
@@ -38,6 +38,7 @@
|
|
|
|
#include <linux/nmi.h>
|
|
|
|
#include <linux/mutex.h>
|
|
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/kdb.h>
|
2012-06-04 21:20:09 +00:00
|
|
|
#ifdef CONFIG_SPARC
|
|
|
|
#include <linux/sunserialcore.h>
|
|
|
|
#endif
|
2012-06-17 19:52:06 +00:00
|
|
|
@@ -2817,7 +2818,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
|
2011-11-20 00:01:55 +00:00
|
|
|
|
|
|
|
touch_nmi_watchdog();
|
|
|
|
|
2012-06-04 21:20:09 +00:00
|
|
|
- if (port->sysrq || oops_in_progress)
|
|
|
|
+ if (port->sysrq || oops_in_progress || in_kdb_printk())
|
|
|
|
locked = spin_trylock_irqsave(&port->lock, flags);
|
|
|
|
else
|
|
|
|
spin_lock_irqsave(&port->lock, flags);
|
2012-06-17 19:52:06 +00:00
|
|
|
diff --git a/include/linux/kdb.h b/include/linux/kdb.h
|
|
|
|
index 0647258..0d1ebfc 100644
|
|
|
|
--- a/include/linux/kdb.h
|
|
|
|
+++ b/include/linux/kdb.h
|
|
|
|
@@ -150,12 +150,14 @@ extern int kdb_register(char *, kdb_func_t, char *, char *, short);
|
2011-11-20 00:01:55 +00:00
|
|
|
extern int kdb_register_repeat(char *, kdb_func_t, char *, char *,
|
|
|
|
short, kdb_repeat_t);
|
|
|
|
extern int kdb_unregister(char *);
|
|
|
|
+#define in_kdb_printk() (kdb_trap_printk)
|
|
|
|
#else /* ! CONFIG_KGDB_KDB */
|
|
|
|
#define kdb_printf(...)
|
|
|
|
#define kdb_init(x)
|
|
|
|
#define kdb_register(...)
|
|
|
|
#define kdb_register_repeat(...)
|
|
|
|
#define kdb_uregister(x)
|
|
|
|
+#define in_kdb_printk() (0)
|
|
|
|
#endif /* CONFIG_KGDB_KDB */
|
|
|
|
enum {
|
|
|
|
KDB_NOT_INITIALIZED,
|
2012-06-17 19:52:06 +00:00
|
|
|
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
|
|
|
|
index bb9520f..eb68a9d 100644
|
|
|
|
--- a/kernel/debug/kdb/kdb_io.c
|
|
|
|
+++ b/kernel/debug/kdb/kdb_io.c
|
|
|
|
@@ -553,7 +553,6 @@ int vkdb_printf(const char *fmt, va_list ap)
|
2011-11-20 00:01:55 +00:00
|
|
|
int diag;
|
|
|
|
int linecount;
|
|
|
|
int logging, saved_loglevel = 0;
|
|
|
|
- int saved_trap_printk;
|
|
|
|
int got_printf_lock = 0;
|
|
|
|
int retlen = 0;
|
|
|
|
int fnd, len;
|
2012-06-17 19:52:06 +00:00
|
|
|
@@ -564,8 +563,6 @@ int vkdb_printf(const char *fmt, va_list ap)
|
2011-11-20 00:01:55 +00:00
|
|
|
unsigned long uninitialized_var(flags);
|
|
|
|
|
|
|
|
preempt_disable();
|
|
|
|
- saved_trap_printk = kdb_trap_printk;
|
|
|
|
- kdb_trap_printk = 0;
|
|
|
|
|
|
|
|
/* Serialize kdb_printf if multiple cpus try to write at once.
|
|
|
|
* But if any cpu goes recursive in kdb, just print the output,
|
|
|
|
@@ -821,7 +818,6 @@ kdb_print_out:
|
|
|
|
} else {
|
|
|
|
__release(kdb_printf_lock);
|
|
|
|
}
|
|
|
|
- kdb_trap_printk = saved_trap_printk;
|
|
|
|
preempt_enable();
|
|
|
|
return retlen;
|
|
|
|
}
|
|
|
|
@@ -831,9 +827,11 @@ int kdb_printf(const char *fmt, ...)
|
|
|
|
va_list ap;
|
|
|
|
int r;
|
|
|
|
|
|
|
|
+ kdb_trap_printk++;
|
|
|
|
va_start(ap, fmt);
|
|
|
|
r = vkdb_printf(fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
+ kdb_trap_printk--;
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|