The purpose of this patch is to provide a -p option to generate a stack
trace of the panic task, if available. It might be useful if the current
context is changed with the 'set' command.
This option is not supported under a live system or live dump.
Signed-off-by: Aaron Tomlin <atomlin(a)redhat.com>
---
help.c | 4 +++-
kernel.c | 19 +++++++++++++++----
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/help.c b/help.c
index c0c750f..581e616 100644
--- a/help.c
+++ b/help.c
@@ -1789,13 +1789,15 @@ NULL
char *help_bt[] = {
"bt",
"backtrace",
-"[-a|-c cpu(s)|-g|-r|-t|-T|-l|-e|-E|-f|-F|-o|-O|-v] [-R ref] [-s [-x|d]]"
+"[-a|-c cpu(s)|-g|-r|-t|-T|-l|-e|-E|-f|-F|-o|-O|-v|-p] [-R ref] [-s [-x|d]]"
"\n [-I ip] [-S sp] [pid | task]",
" Display a kernel stack backtrace. If no arguments are given, the stack",
" trace of the current context will be displayed.\n",
" -a displays the stack traces of the active task on each CPU.",
" (only applicable to crash dumps)",
" -A same as -a, but also displays vector registers (S390X only).",
+" -p display the stack trace of the panic task only.",
+" (only applicable to crash dumps)",
" -c cpu display the stack trace of the active task on one or more CPUs,",
" which can be specified using the format \"3\",
\"1,8,9\", \"1-23\",",
" or \"1,8,9-14\". (only applicable to crash dumps)",
diff --git a/kernel.c b/kernel.c
index f5960fc..e1f0b7e 100644
--- a/kernel.c
+++ b/kernel.c
@@ -2402,7 +2402,7 @@ cmd_bt(void)
int i, c;
ulong value, *cpus;
struct task_context *tc;
- int subsequent, active;
+ int subsequent, active, panic;
struct stack_hook hook;
struct bt_info bt_info, bt_setup, *bt;
struct reference reference;
@@ -2412,7 +2412,7 @@ cmd_bt(void)
tc = NULL;
cpus = NULL;
- subsequent = active = 0;
+ subsequent = active = panic = 0;
hook.eip = hook.esp = 0;
refptr = 0;
bt = &bt_info;
@@ -2421,7 +2421,7 @@ cmd_bt(void)
if (kt->flags & USE_OPT_BT)
bt->flags |= BT_OPT_BACK_TRACE;
- while ((c = getopt(argcnt, args, "D:fFI:S:c:aAloreEgstTdxR:Ov")) != EOF) {
+ while ((c = getopt(argcnt, args, "D:fFI:S:c:aAloreEgstTdxR:Ovp")) != EOF) {
switch (c)
{
case 'f':
@@ -2609,6 +2609,14 @@ cmd_bt(void)
option_not_supported(c);
check_stack_overflow();
return;
+ case 'p':
+ if (LIVE())
+ error(FATAL,
+ "-p option not supported on a live system or live dump\n");
+ if (!tt->panic_task)
+ error(FATAL, "no panic task found!\n");
+ panic++;
+ break;
default:
argerrs++;
@@ -2748,7 +2756,10 @@ cmd_bt(void)
tgid = task_tgid(CURRENT_TASK());
DO_THREAD_GROUP_BACKTRACE();
} else {
- tc = CURRENT_CONTEXT();
+ if (panic)
+ tc = task_to_context(tt->panic_task);
+ else
+ tc = CURRENT_CONTEXT();
DO_TASK_BACKTRACE();
}
return;
--
2.20.1