perf script: Add callindent option
Adrian Hunter
reviewercover perf script: Add callindent option
Hi
Andi Kleen sent a couple of patches to add a callindent option to perf script. If Andi is agreeable, I would like to propose an alternative implementation.
While there are some differences in the resulting output, the main differences are:
1. Tell the decoder to feed branches to the thread stack, which has the advantage that it happens before branch filtering and so can be used with different itrace options (e.g. it still works when only showing calls, even though the thread stack needs to see calls and returns). Also it does not conflict with using the thread stack to get callchains.
2. Print "call" or "ret" instead of using a different event
Adrian Hunter (3):
perf: script: Fix documentation of '-f' when it should be '-F' perf auxtrace: Add option to feed branches to the thread stack perf script: Add callindent option
tools/perf/Documentation/perf-script.txt | 26 +++++++----- tools/perf/builtin-script.c | 70 ++++++++++++++++++++++++++++++++ tools/perf/util/auxtrace.h | 2 + tools/perf/util/intel-bts.c | 22 +++++++--- tools/perf/util/intel-pt.c | 5 ++- tools/perf/util/thread-stack.c | 7 ++++ tools/perf/util/thread-stack.h | 1 + 7 files changed, 117 insertions(+), 16 deletions(-)
Regards
Adrian
Adrian Hunter
reviewerRFC PATCH 1/3 perf: script: Fix documentation of '-f' when it should be '-F'
The documentation for perf script mixes up '-f' and '-F'. Fix it.
--- tools/perf/Documentation/perf-script.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
tools/perf/Documentation/perf-script.txt +10 -10
@@ -119,13 +119,13 @@ OPTIONS srcline, period, iregs, brstack, brstacksym, flags. Field list can be prepended with the type, trace, sw or hw, to indicate to which event type the field list applies. - e.g., -f sw:comm,tid,time,ip,sym and -f trace:time,cpu,trace + e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace - perf script -f <fields> + perf script -F <fields> is equivalent to: - perf script -f trace:<fields> -f sw:<fields> -f hw:<fields> + perf script -F trace:<fields> -F sw:<fields> -F hw:<fields> i.e., the specified fields apply to all event types if the type string is not given.
@@ -133,9 +133,9 @@ OPTIONS The arguments are processed in the order received. A later usage can reset a prior request. e.g.: - -f trace: -f comm,tid,time,ip,sym + -F trace: -F comm,tid,time,ip,sym - The first -f suppresses trace events (field list is ""), but then the + The first -F suppresses trace events (field list is ""), but then the second invocation sets the fields to comm,tid,time,ip,sym. In this case a warning is given to the user:
@@ -143,9 +143,9 @@ OPTIONS Alternatively, consider the order: - -f comm,tid,time,ip,sym -f trace: + -F comm,tid,time,ip,sym -F trace: - The first -f sets the fields for all events and the second -f + The first -F sets the fields for all events and the second -F suppresses trace events. The user is given a warning message about the override, and the result of the above is that only S/W and H/W events are displayed with the given fields.
@@ -154,14 +154,14 @@ OPTIONS event type, a message is displayed to the user that the option is ignored for that type. For example: - $ perf script -f comm,tid,trace + $ perf script -F comm,tid,trace 'trace' not valid for hardware events. Ignoring. 'trace' not valid for software events. Ignoring. Alternatively, if the type is given an invalid field is specified it is an error. For example: - perf script -v -f sw:comm,tid,trace + perf script -v -F sw:comm,tid,trace 'trace' not valid for software events. At this point usage is displayed, and perf-script exits.
@@ -173,7 +173,7 @@ OPTIONS respectively. Finally, a user may not set fields to none for all event types. - i.e., -f "" is not allowed. + i.e., -F "" is not allowed. The brstack output includes branch related information with raw addresses using the /v/v/v/v/ syntax in the following order:
Signature · 1 line
1.9.1
Re: [PATCH RFC 1/3] perf: script: Fix documentation of '-f' when it should be '-F'
Em Thu, Jun 16, 2016 at 03:34:32PM +0300, Adrian Hunter escreveu:
Quoted 1 line
The documentation for perf script mixes up '-f' and '-F'. Fix it.
Applied, thanks,
- Arnaldo
Quoted 78 lines
Signed-off-by Adrian Hunter <[email protected]>--- tools/perf/Documentation/perf-script.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)tools/perf/Documentation/perf-script.txt +10
-10@@ -119,13 +119,13 @@ OPTIONS srcline, period, iregs, brstack, brstacksym, flags. Field list can be prepended with the type, trace, sw or hw, to indicate to which event type the field list applies. - e.g., -f sw:comm,tid,time,ip,sym and -f trace:time,cpu,trace + e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace - perf script -f <fields> + perf script -F <fields> is equivalent to: - perf script -f trace:<fields> -f sw:<fields> -f hw:<fields> + perf script -F trace:<fields> -F sw:<fields> -F hw:<fields> i.e., the specified fields apply to all event types if the type string is not given.@@ -133,9 +133,9 @@ OPTIONS The arguments are processed in the order received. A later usage can reset a prior request. e.g.: - -f trace: -f comm,tid,time,ip,sym + -F trace: -F comm,tid,time,ip,sym - The first -f suppresses trace events (field list is ""), but then the + The first -F suppresses trace events (field list is ""), but then the second invocation sets the fields to comm,tid,time,ip,sym. In this case a warning is given to the user:@@ -143,9 +143,9 @@ OPTIONS Alternatively, consider the order: - -f comm,tid,time,ip,sym -f trace: + -F comm,tid,time,ip,sym -F trace: - The first -f sets the fields for all events and the second -f + The first -F sets the fields for all events and the second -F suppresses trace events. The user is given a warning message about the override, and the result of the above is that only S/W and H/W events are displayed with the given fields.@@ -154,14 +154,14 @@ OPTIONS event type, a message is displayed to the user that the option is ignored for that type. For example: - $ perf script -f comm,tid,trace + $ perf script -F comm,tid,trace 'trace' not valid for hardware events. Ignoring. 'trace' not valid for software events. Ignoring. Alternatively, if the type is given an invalid field is specified it is an error. For example: - perf script -v -f sw:comm,tid,trace + perf script -v -F sw:comm,tid,trace 'trace' not valid for software events. At this point usage is displayed, and perf-script exits.@@ -173,7 +173,7 @@ OPTIONS respectively. Finally, a user may not set fields to none for all event types. - i.e., -f "" is not allowed. + i.e., -F "" is not allowed. The brstack output includes branch related information with raw addresses using the /v/v/v/v/ syntax in the following order:Signature · 1 line
1.9.1
Adrian Hunter
reviewerRFC PATCH 2/3 perf auxtrace: Add option to feed branches to the thread stack
In reply to Adrian HunterIn preparation for using the thread stack to print an indent representing the stack depth in perf script, add an option to tell decoders to feed branches to the thread stack. Add support for that option to Intel PT and Intel BTS.
The advantage of using the decoder to feed the thread stack is that it happens before branch filtering and so can be used with different itrace options (e.g. it still works when only showing calls, even though the thread stack needs to see calls and returns). Also it does not conflict with using the thread stack to get callchains.
--- tools/perf/util/auxtrace.h | 2 ++ tools/perf/util/intel-bts.c | 22 +++++++++++++++++----- tools/perf/util/intel-pt.c | 5 ++++- 3 files changed, 23 insertions(+), 6 deletions(-)
tools/perf/util/auxtrace.h +2 -0
@@ -63,6 +63,7 @@ enum itrace_period_type {* @calls: limit branch samples to calls (can be combined with @returns) * @returns: limit branch samples to returns (can be combined with @calls) * @callchain: add callchain to 'instructions' events +* @thread_stack: feed branches to the thread_stack * @last_branch: add branch context to 'instruction' events * @callchain_sz: maximum callchain size * @last_branch_sz: branch context size
@@ -82,6 +83,7 @@ struct itrace_synth_opts {bool calls;bool returns;bool callchain; +bool thread_stack;bool last_branch;unsigned int callchain_sz;unsigned int last_branch_sz;
tools/perf/util/intel-bts.c +17 -5
@@ -422,7 +422,8 @@ static int intel_bts_get_branch_type(struct intel_bts_queue *btsq, }static int intel_bts_process_buffer (struct intel_bts_queue *btsq, -struct auxtrace_buffer *buffer) +struct auxtrace_buffer *buffer, +struct thread *thread) {struct branch *branch;size_t sz, bsz =sizeof (struct branch );
@@ -444,6 +445,12 @@ static int intel_bts_process_buffer(struct intel_bts_queue *btsq,if (!branch->from && !branch->to)continue ;intel_bts_get_branch_type (btsq, branch); +if (btsq->bts->synth_opts.thread_stack) +thread_stack__event (thread, btsq->sample_flags, +le64_to_cpu (branch->from), +le64_to_cpu (branch->to), + btsq->intel_pt_insn.length, + buffer->buffer_nr +1 );if (filter && !(filter & btsq->sample_flags))continue ; err =intel_bts_synth_branch_sample (btsq, branch);
@@ -507,12 +514,13 @@ static int intel_bts_process_queue(struct intel_bts_queue *btsq, u64 *timestamp) goto out_put; } -if (!btsq->bts->synth_opts.callchain && thread && +if (!btsq->bts->synth_opts.callchain && + !btsq->bts->synth_opts.thread_stack && thread && (!old_buffer || btsq->bts->sampling_mode || (btsq->bts->snapshot_mode && !buffer->consecutive)))thread_stack__set_trace_nr (thread, buffer->buffer_nr +1 ); - err =intel_bts_process_buffer (btsq, buffer); + err =intel_bts_process_buffer (btsq, buffer, thread);auxtrace_buffer__drop_data (buffer);
@@ -905,10 +913,14 @@ int intel_bts_process_auxtrace_info(union perf_event *event,if (dump_trace)return 0 ; -if (session->itrace_synth_opts && session->itrace_synth_opts->set) +if (session->itrace_synth_opts && session->itrace_synth_opts->set) { bts->synth_opts = *session->itrace_synth_opts; -else + }else {itrace_synth_opts__set_default (&bts->synth_opts); +if (session->itrace_synth_opts) + bts->synth_opts.thread_stack = + session->itrace_synth_opts->thread_stack; + }if (bts->synth_opts.calls) bts->branches_filter |= PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC |
tools/perf/util/intel-pt.c +4 -1
@@ -1233,7 +1233,7 @@ static int intel_pt_sample(struct intel_pt_queue *ptq)if (!(state->type &INTEL_PT_BRANCH ))return 0 ; -if (pt->synth_opts.callchain) +if (pt->synth_opts.callchain || pt->synth_opts.thread_stack)thread_stack__event (ptq->thread, ptq->flags, state->from_ip, state->to_ip, ptq->insn_len, state->trace_nr);
@@ -2136,6 +2136,9 @@ int intel_pt_process_auxtrace_info(union perf_event *event, pt->synth_opts.branches = false; pt->synth_opts.callchain = true; } +if (session->itrace_synth_opts) + pt->synth_opts.thread_stack = + session->itrace_synth_opts->thread_stack; }if (pt->synth_opts.log)
Signature · 1 line
1.9.1
Adrian Hunter
reviewerRFC PATCH 3/3 perf script: Add callindent option
In reply to Adrian HunterBased on patches from Andi Kleen.
When printing PT instruction traces with perf script it is rather useful to see some indentation for the call tree. This patch adds a new callindent field to perf script that prints spaces for the function call stack depth.
We already have code to track the function call stack for PT, that we can reuse with minor modifications.
The resulting output is not quite as nice as ftrace yet, but a lot better than what was there before.
Note there are some corner cases when the thread stack gets code confused and prints incorrect indentation. Even with that it is fairly useful.
When displaying kernel code traces it is recommended to run as root, as otherwise perf doesn't understand the kernel addresses properly, and may not reset the call stack correctly on kernel boundaries.
Example output:
sudo perf-with-kcore record eg2 -a -e intel_pt// -- sleep 1
sudo perf-with-kcore script eg2 --ns -F callindent,time,comm,pid,sym,ip,addr,event,cpu --itrace=cre | less
...
swapper 0 [000] 21191.973043157: branches: call irq_exit ffffffff8104e880 smp_call_function_single_interrupt+0x30 => ffffffff8107f2b0 irq_exit
swapper 0 [000] 21191.973043157: branches: call idle_cpu ffffffff8107f2f9 irq_exit+0x49 => ffffffff810a5890 idle_cpu
swapper 0 [000] 21191.973043157: branches: ret idle_cpu ffffffff810a58d7 idle_cpu+0x47 => ffffffff8107f2fe irq_exit
swapper 0 [000] 21191.973043157: branches: call tick_nohz_irq_exit ffffffff8107f34d irq_exit+0x9d => ffffffff810f4850 tick_nohz_irq_exit
swapper 0 [000] 21191.973043157: branches: call __tick_nohz_idle_enter ffffffff810f4870 tick_nohz_irq_exit+0x20 => ffffffff810f4160 __tick_nohz_idle_enter
swapper 0 [000] 21191.973043157: branches: call ktime_get ffffffff810f4181 __tick_nohz_idle_enter+0x21 => ffffffff810eb750 ktime_get
swapper 0 [000] 21191.973043157: branches: call read_tsc ffffffff810eb786 ktime_get+0x36 => ffffffff810362e0 read_tsc
swapper 0 [000] 21191.973043157: branches: ret read_tsc ffffffff810362f4 read_tsc+0x14 => ffffffff810eb78c ktime_get
swapper 0 [000] 21191.973043157: branches: ret ktime_get ffffffff810eb7d6 ktime_get+0x86 => ffffffff810f4186 __tick_nohz_idle_enter
swapper 0 [000] 21191.973043157: branches: call sched_clock_idle_sleep_event ffffffff810f419b __tick_nohz_idle_enter+0x3b => ffffffff810a9220 sched_clock_idle_sleep_event
swapper 0 [000] 21191.973043157: branches: call sched_clock_cpu ffffffff810a922b sched_clock_idle_sleep_event+0xb => ffffffff810a9180 sched_clock_cpu
swapper 0 [000] 21191.973043157: branches: call sched_clock ffffffff810a91ed sched_clock_cpu+0x6d => ffffffff810369d0 sched_clock
swapper 0 [000] 21191.973043157: branches: call native_sched_clock ffffffff810369d4 sched_clock+0x4 => ffffffff810368c0 native_sched_clock
swapper 0 [000] 21191.973043157: branches: ret native_sched_clock ffffffff8103690c native_sched_clock+0x4c => ffffffff810369d9 sched_clock
swapper 0 [000] 21191.973043157: branches: ret sched_clock ffffffff810369dc sched_clock+0xc => ffffffff810a91f2 sched_clock_cpu
swapper 0 [000] 21191.973043157: branches: ret sched_clock_cpu ffffffff810a91f6 sched_clock_cpu+0x76 => ffffffff810a9230 sched_clock_idle_sleep_event
swapper 0 [000] 21191.973043157: branches: ret sched_clock_idle_sleep_event ffffffff810a9231 sched_clock_idle_sleep_event+0x11 => ffffffff810f41a0 __tick_nohz_idle_enter--- tools/perf/Documentation/perf-script.txt | 6 +++ tools/perf/builtin-script.c | 70 ++++++++++++++++++++++++++++++++ tools/perf/util/thread-stack.c | 7 ++++ tools/perf/util/thread-stack.h | 1 + 4 files changed, 84 insertions(+)
tools/perf/Documentation/perf-script.txt +6 -0
@@ -172,6 +172,12 @@ OPTIONS transaction abort, trace begin, trace end, and in transaction, respectively. + The callindent field is synthesized and may have a value when + Instruction Trace decoding. For calls and returns, it will display the + name of the symbol indented with spaces to reflect the stack depth. To + differentiate: calls are prefixed by "call", returns by "ret", trace + start by "strt" and trace end by "end". + Finally, a user may not set fields to none for all event types. i.e., -F "" is not allowed.
tools/perf/builtin-script.c +70 -0
100 lines not on this page · raw message
tools/perf/util/thread-stack.c +7 -0
@@ -616,3 +616,10 @@ int thread_stack__process(struct thread *thread, struct comm *comm,return err; } + +size_t thread_stack__depth (struct thread *thread) +{ +if (!thread->ts) +return 0 ; +return thread->ts->cnt; +}
tools/perf/util/thread-stack.h +1 -0
@@ -87,6 +87,7 @@ void thread_stack__sample(struct thread *thread, struct ip_callchain *chain, size_t sz, u64 ip);int thread_stack__flush (struct thread *thread);void thread_stack__free (struct thread *thread); +size_t thread_stack__depth (struct thread *thread);struct call_return_processor * call_return_processor__new(int (*process)(struct call_return *cr, void *data),
Signature · 1 line
1.9.1
Adrian Hunter
reviewerRFC PATCH v2 3/3 perf script: Add callindent option
Based on patches from Andi Kleen.
When printing PT instruction traces with perf script it is rather useful to see some indentation for the call tree. This patch adds a new callindent field to perf script that prints spaces for the function call stack depth.
We already have code to track the function call stack for PT, that we can reuse with minor modifications.
The resulting output is not quite as nice as ftrace yet, but a lot better than what was there before.
Note there are some corner cases when the thread stack gets code confused and prints incorrect indentation. Even with that it is fairly useful.
When displaying kernel code traces it is recommended to run as root, as otherwise perf doesn't understand the kernel addresses properly, and may not reset the call stack correctly on kernel boundaries.
Example output:
sudo perf-with-kcore record eg2 -a -e intel_pt// -- sleep 1
sudo perf-with-kcore script eg2 --ns -F callindent,time,comm,pid,sym,ip,addr,event,cpu --itrace=cre | less
...
swapper 0 [000] 21191.973043157: branches: call irq_exit ffffffff8104e880 smp_call_function_single_interrupt+0x30 => ffffffff8107f2b0 irq_exit
swapper 0 [000] 21191.973043157: branches: call idle_cpu ffffffff8107f2f9 irq_exit+0x49 => ffffffff810a5890 idle_cpu
swapper 0 [000] 21191.973043157: branches: ret idle_cpu ffffffff810a58d7 idle_cpu+0x47 => ffffffff8107f2fe irq_exit
swapper 0 [000] 21191.973043157: branches: call tick_nohz_irq_exit ffffffff8107f34d irq_exit+0x9d => ffffffff810f4850 tick_nohz_irq_exit
swapper 0 [000] 21191.973043157: branches: call __tick_nohz_idle_enter ffffffff810f4870 tick_nohz_irq_exit+0x20 => ffffffff810f4160 __tick_nohz_idle_enter
swapper 0 [000] 21191.973043157: branches: call ktime_get ffffffff810f4181 __tick_nohz_idle_enter+0x21 => ffffffff810eb750 ktime_get
swapper 0 [000] 21191.973043157: branches: call read_tsc ffffffff810eb786 ktime_get+0x36 => ffffffff810362e0 read_tsc
swapper 0 [000] 21191.973043157: branches: ret read_tsc ffffffff810362f4 read_tsc+0x14 => ffffffff810eb78c ktime_get
swapper 0 [000] 21191.973043157: branches: ret ktime_get ffffffff810eb7d6 ktime_get+0x86 => ffffffff810f4186 __tick_nohz_idle_enter
swapper 0 [000] 21191.973043157: branches: call sched_clock_idle_sleep_event ffffffff810f419b __tick_nohz_idle_enter+0x3b => ffffffff810a9220 sched_clock_idle_sleep_event
swapper 0 [000] 21191.973043157: branches: call sched_clock_cpu ffffffff810a922b sched_clock_idle_sleep_event+0xb => ffffffff810a9180 sched_clock_cpu
swapper 0 [000] 21191.973043157: branches: call sched_clock ffffffff810a91ed sched_clock_cpu+0x6d => ffffffff810369d0 sched_clock
swapper 0 [000] 21191.973043157: branches: call native_sched_clock ffffffff810369d4 sched_clock+0x4 => ffffffff810368c0 native_sched_clock
swapper 0 [000] 21191.973043157: branches: ret native_sched_clock ffffffff8103690c native_sched_clock+0x4c => ffffffff810369d9 sched_clock
swapper 0 [000] 21191.973043157: branches: ret sched_clock ffffffff810369dc sched_clock+0xc => ffffffff810a91f2 sched_clock_cpu
swapper 0 [000] 21191.973043157: branches: ret sched_clock_cpu ffffffff810a91f6 sched_clock_cpu+0x76 => ffffffff810a9230 sched_clock_idle_sleep_event
swapper 0 [000] 21191.973043157: branches: ret sched_clock_idle_sleep_event ffffffff810a9231 sched_clock_idle_sleep_event+0x11 => ffffffff810f41a0 __tick_nohz_idle_enter---
Changes in V2:
Original patch had 2 chunks missing
tools/perf/Documentation/perf-script.txt | 6 +++ tools/perf/builtin-script.c | 76 +++++++++++++++++++++++++++++++- tools/perf/util/thread-stack.c | 7 +++ tools/perf/util/thread-stack.h | 1 + 4 files changed, 89 insertions(+), 1 deletion(-)
tools/perf/Documentation/perf-script.txt +6 -0
@@ -172,6 +172,12 @@ OPTIONS transaction abort, trace begin, trace end, and in transaction, respectively. + The callindent field is synthesized and may have a value when + Instruction Trace decoding. For calls and returns, it will display the + name of the symbol indented with spaces to reflect the stack depth. To + differentiate: calls are prefixed by "call", returns by "ret", trace + start by "strt" and trace end by "end". + Finally, a user may not set fields to none for all event types. i.e., -F "" is not allowed.
tools/perf/builtin-script.c +75 -1
118 lines not on this page · raw message
tools/perf/util/thread-stack.c +7 -0
@@ -616,3 +616,10 @@ int thread_stack__process(struct thread *thread, struct comm *comm,return err; } + +size_t thread_stack__depth (struct thread *thread) +{ +if (!thread->ts) +return 0 ; +return thread->ts->cnt; +}
tools/perf/util/thread-stack.h +1 -0
@@ -87,6 +87,7 @@ void thread_stack__sample(struct thread *thread, struct ip_callchain *chain, size_t sz, u64 ip);int thread_stack__flush (struct thread *thread);void thread_stack__free (struct thread *thread); +size_t thread_stack__depth (struct thread *thread);struct call_return_processor * call_return_processor__new(int (*process)(struct call_return *cr, void *data),
Signature · 1 line
1.9.1
Quoted 12 lines · Adrian Hunter
Based on patches from Andi Kleen.
When printing PT instruction traces with perf script it is rather useful to see some indentation for the call tree. This patch adds a new callindent field to perf script that prints spaces for the function call stack depth.
We already have code to track the function call stack for PT, that we can reuse with minor modifications.
The resulting output is not quite as nice as ftrace yet, but a lot better than what was there before.
Quoted 6 lines
Note there are some corner cases when the thread stack gets code confused and prints incorrect indentation. Even with that it is fairly useful.
When displaying kernel code traces it is recommended to run as root, as otherwise perf doesn't understand the kernel addresses properly, and may not reset the call stack correctly on kernel boundaries.
I still would prefer to have call returns as event names instead of branches, and not implicitly in the output, mainly so that it can be disabled if needed, and give easier to read output.
The rest of the patch looks good to me. Perhaps you could just drop the prefix for now.
-Andi
Arnaldo Carvalho de Melo
maintainerEm Thu, Jun 16, 2016 at 03:34:31PM +0300, Adrian Hunter escreveu:
Quoted 5 lines
Hi
Andi Kleen sent a couple of patches to add a callindent option to perf script. If Andi is agreeable, I would like to propose an alternative implementation.
Andi?
- Arnaldo
Quoted 29 lines
While there are some differences in the resulting output, the main differences are:
1. Tell the decoder to feed branches to the thread stack, which has the advantage that it happens before branch filtering and so can be used with different itrace options (e.g. it still works when only showing calls, even though the thread stack needs to see calls and returns). Also it does not conflict with using the thread stack to get callchains.
2. Print "call" or "ret" instead of using a different event
Adrian Hunter (3):
perf: script: Fix documentation of '-f' when it should be '-F' perf auxtrace: Add option to feed branches to the thread stack perf script: Add callindent optiontools/perf/Documentation/perf-script.txt | 26 +++++++----- tools/perf/builtin-script.c | 70 ++++++++++++++++++++++++++++++++ tools/perf/util/auxtrace.h | 2 + tools/perf/util/intel-bts.c | 22 +++++++--- tools/perf/util/intel-pt.c | 5 ++- tools/perf/util/thread-stack.c | 7 ++++ tools/perf/util/thread-stack.h | 1 + 7 files changed, 117 insertions(+), 16 deletions(-)Regards
Adrian