Re: [PATCH v3 1/2] powerpc/xmon: Dump ftrace buffers for the current CPU only
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2017-08-15 03:37:58
Breno Leitao [off-list ref] writes:
Hello Michael, On Mon, Aug 14, 2017 at 11:00:07PM +1000, Michael Ellerman wrote:quoted
Breno Leitao [off-list ref] writes:quoted
@@ -2231,6 +2232,19 @@ static void xmon_rawdump (unsigned long adrs, long ndump) printf("\n"); } +static void dump_tracing(void) +{ + int c; + + c = inchar(); + if (c == 'c') + ftrace_dump(DUMP_ORIG); + else + ftrace_dump(DUMP_ALL); + + tracing_on(); +}Thinking about this some more, two things that would make this *really* useful. Firstly, it would be great if we could dump the buffer for *another* CPU.Well, you can do it with this new 'dtc' option on xmon. You just need to change to that CPU prior to call 'dtc'.
But that's the problem. If the other CPU is stuck then you can't change
to it in xmon.
If it *isn't* stuck, then you can just change to it and backtrace like
normal.
eg, if you use the HARDLOCKUP lkdtm test:
# cd /sys/kernel/debug/provoke-crash
# echo HARDLOCKUP > DIRECT
sysrq: SysRq : Entering xmon
cpu 0x1: Vector: 501 (Hardware Interrupt) at [c0000000fe9af9a0]
pc: c0000000000f15d0: plpar_hcall_norets+0x1c/0x28
lr: c000000000daaf04: check_and_cede_processor+0x34/0x50
sp: c0000000fe9afc20
msr: 8000000000009033
current = 0xc0000000fe95a200
paca = 0xc00000000fd40580 softe: 0 irq_happened: 0x09
pid = 0, comm = swapper/1
Linux version 4.13.0-rc2-gcc-6.3.1-00101-ged49f7fd6438 (michael@ka3.ozlabs.ibm.com) (gcc version 6.3.1 20170214 (Custom e9096cb27f4bd642)) #455 SMP Mon Aug 14 22:19:37 AEST 2017
enter ? for help
[link register ] c000000000daaf04 check_and_cede_processor+0x34/0x50
[c0000000fe9afc20] c000000000daaef0 check_and_cede_processor+0x20/0x50 (unreliable)
[c0000000fe9afc80] c000000000daaf94 shared_cede_loop+0x74/0x2b0
[c0000000fe9afcd0] c000000000da6fa0 cpuidle_enter_state+0xe0/0x6b0
[c0000000fe9afd50] c0000000001ff17c call_cpuidle+0x7c/0x110
[c0000000fe9afd90] c0000000001ff800 do_idle+0x350/0x460
[c0000000fe9afe20] c0000000001ffbe8 cpu_startup_entry+0x38/0x40
[c0000000fe9afe50] c000000000060108 start_secondary+0x528/0xb90
[c0000000fe9aff90] c00000000000af6c start_secondary_prolog+0x10/0x14
1:mon> c
cpus stopped: 0x0-0x5 0x7-0xf
1:mon>
1:mon> c 6
cpu 0x6 isn't in xmon
Notice that CPU 6 hasn't called in, so we can't switch to it, and we
have no (easy) way of working out where it is.
If we could dump the ftrace buffer for CPU 6 from another CPU, we'd be
able to see eg:
6) | SyS_write() {
6) | __fdget_pos() {
6) 0.088 us | __fget_light();
6) 1.168 us | }
6) | vfs_write() {
6) 0.092 us | rw_verify_area();
6) 0.062 us | __sb_start_write();
6) | __vfs_write() {
...
6) | lkdtm_do_action() {
6) | lkdtm_HARDLOCKUP() {
---------------------------------
Which would be helpful.
cheers