Re: [PATCH V6 15/17] perf tools: Intel BTS to always update thread stack trace number

From: Arnaldo Carvalho de Melo
Date: Fri Jun 19 2015 - 12:11:34 EST


Em Fri, May 29, 2015 at 04:33:43PM +0300, Adrian Hunter escreveu:
> The enhanced thread stack is used by higher layers but still requires
> the trace number. The trace number is used to distinguish discontinuous
> sections of trace (for example from Snapshot mode or Sample mode), which
> cause the thread stack to be flushed.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> ---
> tools/perf/util/intel-bts.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c
> index b068860..cd7bde3 100644
> --- a/tools/perf/util/intel-bts.c
> +++ b/tools/perf/util/intel-bts.c
> @@ -27,6 +27,8 @@
> #include "machine.h"
> #include "session.h"
> #include "util.h"
> +#include "thread.h"
> +#include "thread-stack.h"
> #include "debug.h"
> #include "tsc.h"
> #include "auxtrace.h"
> @@ -443,19 +445,22 @@ static int intel_bts_process_buffer(struct intel_bts_queue *btsq,
>
> static int intel_bts_process_queue(struct intel_bts_queue *btsq, u64 *timestamp)
> {
> - struct auxtrace_buffer *buffer = btsq->buffer;
> + struct auxtrace_buffer *buffer = btsq->buffer, *old_buffer = buffer;
> struct auxtrace_queue *queue;
> + struct thread *thread;
> int err;
>
> if (btsq->done)
> return 1;
>
> if (btsq->pid == -1) {
> - struct thread *thread;
> -
> - thread = machine__find_thread(btsq->bts->machine, -1, btsq->tid);
> + thread = machine__find_thread(btsq->bts->machine, -1,
> + btsq->tid);
> if (thread)
> btsq->pid = thread->pid_;
> + } else {
> + thread = machine__findnew_thread(btsq->bts->machine, btsq->pid,
> + btsq->tid);

Humm, so what will be done with the reference count you got from
machine__findnew_thread()? You have to drop it when you're done with
using this thread.

> }
>
> queue = &btsq->bts->queues.queue_array[btsq->queue_nr];
> @@ -485,6 +490,11 @@ static int intel_bts_process_queue(struct intel_bts_queue *btsq, u64 *timestamp)
> intel_bts_do_fix_overlap(queue, buffer))
> return -ENOMEM;
>
> + if (!btsq->bts->synth_opts.callchain && 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);
>
> auxtrace_buffer__drop_data(buffer);
> --
> 1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/