[Crash-utility] [PATCH] Make bt -a accept a CPU as an argument
Dave Anderson
anderson at redhat.com
Sat Apr 26 23:28:49 UTC 2014
----- Original Message -----
> Currently 'bt -a' displays the stack traces of the active task on each
> CPU. This patch makes it possible to specify a CPU as an argument.
> Multiple CPU arguments may be specified. If no argument is given
> the default behaviour is maintained.
Hi Aaron,
That's a great idea -- but I'd prefer not to overload the -a option.
Since -c is available, can you use the already-available make_cpumask()
utility function to create a mask out of a comma or dash separated cpu
list? You can basically do the same thing as "irq -c" -- check out
"help irq" for the help page description, and cmd_irq() for a code
template.
Thanks,
Dave
>
> For example:
>
> Display the stack trace of the active task on CPU 0 and 1:
>
> crash> bt -a 0 1
> PID: 0 TASK: ffffffff81a8d020 CPU: 0 COMMAND: "swapper"
> #0 [ffff880002207e90] crash_nmi_callback at ffffffff8102fee6
> #1 [ffff880002207ea0] notifier_call_chain at ffffffff8152d525
> #2 [ffff880002207ee0] atomic_notifier_call_chain at ffffffff8152d58a
> #3 [ffff880002207ef0] notify_die at ffffffff810a155e
> #4 [ffff880002207f20] do_nmi at ffffffff8152b1eb
> #5 [ffff880002207f50] nmi at ffffffff8152aab0
> [exception RIP: native_safe_halt+0xb]
> RIP: ffffffff8103eacb RSP: ffffffff81a01ea8 RFLAGS: 00000296
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff81de5228
> RBP: ffffffff81a01ea8 R8: 0000000000000000 R9: 0000000000000000
> R10: 0012099429a6bea3 R11: 0000000000000000 R12: ffffffff81c066c0
> R13: 0000000000000000 R14: ffffffffffffffff R15: ffffffff81de1000
> ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
> --- <NMI exception stack> ---
> #6 [ffffffff81a01ea8] native_safe_halt at ffffffff8103eacb
> #7 [ffffffff81a01eb0] default_idle at ffffffff810167bd
> #8 [ffffffff81a01ed0] cpu_idle at ffffffff81009fc6
>
> PID: 38 TASK: ffff88003eaae040 CPU: 1 COMMAND: "khungtaskd"
> #0 [ffff88003ad97ce8] machine_kexec at ffffffff81038f3b
> #1 [ffff88003ad97d48] crash_kexec at ffffffff810c5da2
> #2 [ffff88003ad97e18] panic at ffffffff8152721a
> #3 [ffff88003ad97e98] watchdog at ffffffff810e6346
> #4 [ffff88003ad97ee8] kthread at ffffffff8109af06
> #5 [ffff88003ad97f48] kernel_thread at ffffffff8100c20a
>
> Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
> ---
> help.c | 37 ++++++++++++++++++++++++++++++++++---
> kernel.c | 26 +++++++++++++++++++++++---
> 2 files changed, 57 insertions(+), 6 deletions(-)
>
> diff --git a/help.c b/help.c
> index 91f22c3..62af23a 100644
> --- a/help.c
> +++ b/help.c
> @@ -1704,11 +1704,13 @@ NULL
> char *help_bt[] = {
> "bt",
> "backtrace",
> -"[-a|-g|-r|-t|-T|-l|-e|-E|-f|-F|-o|-O] [-R ref] [-s [-x|d]] [-I ip] [-S sp]"
> +"[-a [cpu]|-g|-r|-t|-T|-l|-e|-E|-f|-F|-o|-O] [-R ref] [-s [-x|d]] [-I ip]
> [-S sp]"
> "\n [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.",
> +" -a display the stack trace of the active task on a given CPU.",
> +" Multiple CPU arguments may be specified. If no arguments are
> given",
> +" the stack trace of the active task on each CPU is shown.",
> " (only applicable to crash dumps)",
> #ifdef GDB_5_3
> " -g use gdb stack trace code. (alpha only)",
> @@ -1766,7 +1768,36 @@ char *help_bt[] = {
> " or display a stale frame reference. When in doubt as to the accuracy of
> a",
> " backtrace, the -t or -T options may help fill in the blanks.\n",
> "EXAMPLES",
> -" Display the stack trace of the active task(s) when the kernel
> panicked:\n",
> +" Display the stack trace of the active task on CPU 0 and 1:\n",
> +" %s> bt -a 0 1",
> +" PID: 0 TASK: ffffffff81a8d020 CPU: 0 COMMAND: \"swapper\"",
> +" #0 [ffff880002207e90] crash_nmi_callback at ffffffff8102fee6",
> +" #1 [ffff880002207ea0] notifier_call_chain at ffffffff8152d525",
> +" #2 [ffff880002207ee0] atomic_notifier_call_chain at ffffffff8152d58a",
> +" #3 [ffff880002207ef0] notify_die at ffffffff810a155e",
> +" #4 [ffff880002207f20] do_nmi at ffffffff8152b1eb",
> +" #5 [ffff880002207f50] nmi at ffffffff8152aab0",
> +" [exception RIP: native_safe_halt+0xb]",
> +" RIP: ffffffff8103eacb RSP: ffffffff81a01ea8 RFLAGS: 00000296",
> +" RAX: 0000000000000000 RBX: 0000000000000000 RCX:
> 0000000000000000",
> +" RDX: 0000000000000000 RSI: 0000000000000001 RDI:
> ffffffff81de5228",
> +" RBP: ffffffff81a01ea8 R8: 0000000000000000 R9:
> 0000000000000000",
> +" R10: 0012099429a6bea3 R11: 0000000000000000 R12:
> ffffffff81c066c0",
> +" R13: 0000000000000000 R14: ffffffffffffffff R15:
> ffffffff81de1000",
> +" ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018",
> +" --- <NMI exception stack> ---",
> +" #6 [ffffffff81a01ea8] native_safe_halt at ffffffff8103eacb",
> +" #7 [ffffffff81a01eb0] default_idle at ffffffff810167bd",
> +" #8 [ffffffff81a01ed0] cpu_idle at ffffffff81009fc6",
> +" ",
> +" PID: 38 TASK: ffff88003eaae040 CPU: 1 COMMAND: \"khungtaskd\"",
> +" #0 [ffff88003ad97ce8] machine_kexec at ffffffff81038f3b",
> +" #1 [ffff88003ad97d48] crash_kexec at ffffffff810c5da2",
> +" #2 [ffff88003ad97e18] panic at ffffffff8152721a",
> +" #3 [ffff88003ad97e98] watchdog at ffffffff810e6346",
> +" #4 [ffff88003ad97ee8] kthread at ffffffff8109af06",
> +" #5 [ffff88003ad97f48] kernel_thread at ffffffff8100c20a",
> +"\n Display the stack trace of the active task(s) when the kernel
> panicked:\n",
> " %s> bt -a",
> " PID: 286 TASK: c0b3a000 CPU: 0 COMMAND: \"in.rlogind\"",
> " #0 [c0b3be90] crash_save_current_state at c011aed0",
> diff --git a/kernel.c b/kernel.c
> index cdc53eb..6b3e25b 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -1972,15 +1972,15 @@ cmd_bt(void)
> int i, c;
> ulong value;
> struct task_context *tc;
> - int count, subsequent, active;
> + int count, subsequent, active, cpu;
> struct stack_hook hook;
> struct bt_info bt_info, bt_setup, *bt;
> struct reference reference;
> char *refptr;
> - ulong tgid;
> + ulong tgid, task;
>
> tc = NULL;
> - subsequent = active = count = 0;
> + subsequent = active = count = cpu = 0;
> hook.eip = hook.esp = 0;
> refptr = 0;
> bt = &bt_info;
> @@ -2232,6 +2232,26 @@ cmd_bt(void)
> error(FATAL,
> "-a option cannot be used with the -g option\n");
>
> + while (args[optind]) {
> + cpu = dtoi(args[optind], FAULT_ON_ERROR, NULL);
> + if (cpu >= kt->cpus) {
> + error(FATAL, "invalid cpu number: system has only %d cpu%s\n",
> + kt->cpus, kt->cpus > 1 ? "s" : "");
> + return;
> + }
> + if ((task = get_active_task(cpu)))
> + tc = task_to_context(task);
> + else {
> + error(FATAL, "cannot determine active task on cpu %ld\n", cpu);
> + return;
> + }
> + DO_TASK_BACKTRACE();
> +
> + optind++;
> + if (!args[optind])
> + return;
> + }
> +
> for (c = 0; c < NR_CPUS; c++) {
> if (setjmp(pc->foreach_loop_env)) {
> pc->flags &= ~IN_FOREACH;
> --
> 1.9.0
>
>
More information about the Crash-utility
mailing list