From: Mike Travis <travis@sgi.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Paul Mackerras <paulus@samba.org>, Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
Jason Wessel <jason.wessel@windriver.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Dimitri Sivanich <sivanich@sgi.com>, Hedi Berriche <hedi@sgi.com>,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 6/7] x86/UV: Add call to KGDB/KDB from NMI handler
Date: Mon, 23 Sep 2013 16:25:05 -0500 [thread overview]
Message-ID: <20130923212501.026092045@asylum.americas.sgi.com> (raw)
In-Reply-To: <20130923212459.544517569@asylum.americas.sgi.com>
[-- Attachment #1: uv-add-nmi-call-kdb.patch --]
[-- Type: text/plain, Size: 3526 bytes --]
This patch restores the capability to enter KDB (and KGDB) from the UV NMI
handler. This is needed because the UV system console is not capable of
sending the 'break' signal to the serial console port. It is also useful
when the kernel is hung in such a way that it isn't responding to normal
external I/O, so sending 'g' to sysreq-trigger does not work either.
Another benefit of the external NMI command is that all the cpus receive
the NMI signal at roughly the same time so they are more closely aligned
timewise.
It utilizes the newly added kgdb_nmicallin function to gain entry
to KGDB/KDB by the master. The slaves still enter via the standard
kgdb_nmicallback function. It also uses the new 'send_ready' pointer
to tell KGDB/KDB to signal the slaves when to proceed into the KGDB
slave loop.
It is enabled when the nmi action is set to "kdb" and the kernel is
built with CONFIG_KDB enabled.
Signed-off-by: Mike Travis <travis@sgi.com>
Reviewed-by: Dimitri Sivanich <sivanich@sgi.com>
Reviewed-by: Hedi Berriche <hedi@sgi.com>
---
arch/x86/platform/uv/uv_nmi.c | 47 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 46 insertions(+), 1 deletion(-)
--- linux.orig/arch/x86/platform/uv/uv_nmi.c
+++ linux/arch/x86/platform/uv/uv_nmi.c
@@ -21,7 +21,9 @@
#include <linux/cpu.h>
#include <linux/delay.h>
+#include <linux/kdb.h>
#include <linux/kexec.h>
+#include <linux/kgdb.h>
#include <linux/module.h>
#include <linux/nmi.h>
#include <linux/sched.h>
@@ -32,6 +34,7 @@
#include <asm/kdebug.h>
#include <asm/local64.h>
#include <asm/nmi.h>
+#include <asm/traps.h>
#include <asm/uv/uv.h>
#include <asm/uv/uv_hub.h>
#include <asm/uv/uv_mmrs.h>
@@ -146,8 +149,9 @@ module_param_named(retry_count, uv_nmi_r
* "dump" - dump process stack for each cpu
* "ips" - dump IP info for each cpu
* "kdump" - do crash dump
+ * "kdb" - enter KDB/KGDB (default)
*/
-static char uv_nmi_action[8] = "dump";
+static char uv_nmi_action[8] = "kdb";
module_param_string(action, uv_nmi_action, sizeof(uv_nmi_action), 0644);
static inline bool uv_nmi_action_is(const char *action)
@@ -533,6 +537,43 @@ static inline void uv_nmi_kdump(int cpu,
}
#endif /* !CONFIG_KEXEC */
+#ifdef CONFIG_KGDB_KDB
+/* Call KDB from NMI handler */
+static void uv_call_kdb(int cpu, struct pt_regs *regs, int master)
+{
+ int ret;
+
+ if (master) {
+ /* call KGDB NMI handler as MASTER */
+ ret = kgdb_nmicallin(cpu, X86_TRAP_NMI, regs,
+ &uv_nmi_slave_continue);
+ if (ret) {
+ pr_alert("KDB returned error, is kgdboc set?\n");
+ atomic_set(&uv_nmi_slave_continue, SLAVE_EXIT);
+ }
+ } else {
+ /* wait for KGDB signal that it's ready for slaves to enter */
+ int sig;
+
+ do {
+ cpu_relax();
+ sig = atomic_read(&uv_nmi_slave_continue);
+ } while (!sig);
+
+ /* call KGDB as slave */
+ if (sig == SLAVE_CONTINUE)
+ ret = kgdb_nmicallback(cpu, regs);
+ }
+ uv_nmi_sync_exit(master);
+}
+
+#else /* !CONFIG_KGDB_KDB */
+static inline void uv_call_kdb(int cpu, struct pt_regs *regs, int master)
+{
+ pr_err("UV: NMI error: KGDB/KDB is not enabled in this kernel\n");
+}
+#endif /* !CONFIG_KGDB_KDB */
+
/*
* UV NMI handler
*/
@@ -565,6 +606,10 @@ int uv_handle_nmi(unsigned int reason, s
if (uv_nmi_action_is("ips") || uv_nmi_action_is("dump"))
uv_nmi_dump_state(cpu, regs, master);
+ /* Call KDB if enabled */
+ else if (uv_nmi_action_is("kdb"))
+ uv_call_kdb(cpu, regs, master);
+
/* Clear per_cpu "in nmi" flag */
atomic_set(&uv_cpu_nmi.state, UV_NMI_STATE_OUT);
--
next prev parent reply other threads:[~2013-09-23 21:26 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-23 21:24 [PATCH 0/7] x86/UV/KDB/NMI: Updates for NMI/KDB handler for SGI UV Mike Travis
2013-09-23 21:25 ` [PATCH 1/7] x86/UV: Move NMI support Mike Travis
2013-09-24 8:37 ` [tip:x86/uv] " tip-bot for Mike Travis
2013-09-23 21:25 ` [PATCH 2/7] x86/UV: Update UV support for external NMI signals Mike Travis
2013-09-24 8:37 ` [tip:x86/uv] " tip-bot for Mike Travis
2013-09-23 21:25 ` [PATCH 3/7] x86/UV: Add summary of cpu activity to UV NMI handler Mike Travis
2013-09-24 8:37 ` [tip:x86/uv] " tip-bot for Mike Travis
2013-09-23 21:25 ` [PATCH 4/7] x86/UV: Add kdump " Mike Travis
2013-09-24 8:37 ` [tip:x86/uv] " tip-bot for Mike Travis
2013-09-23 21:25 ` [PATCH 5/7] KGDB/KDB: add support for external NMI handler to call KGDB/KDB Mike Travis
2013-09-24 8:15 ` Ingo Molnar
2013-09-26 20:45 ` Jason Wessel
2013-10-03 5:45 ` Ingo Molnar
2013-09-23 21:25 ` Mike Travis [this message]
2013-09-23 21:25 ` [PATCH 7/7] x86/UV: Add uvtrace support Mike Travis
2013-09-24 8:38 ` [tip:x86/uv] " tip-bot for Mike Travis
2013-11-11 18:53 ` Ingo Molnar
2013-11-11 19:09 ` Mike Travis
2013-11-11 20:17 ` Ingo Molnar
2013-09-24 7:52 ` [PATCH 0/7] x86/UV/KDB/NMI: Updates for NMI/KDB handler for SGI UV Ingo Molnar
2013-09-24 13:51 ` Mike Travis
2013-09-24 14:59 ` Ingo Molnar
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=20130923212501.026092045@asylum.americas.sgi.com \
--to=travis@sgi.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=akpm@linux-foundation.org \
--cc=hedi@sgi.com \
--cc=hpa@zytor.com \
--cc=jason.wessel@windriver.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=paulus@samba.org \
--cc=sivanich@sgi.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®