All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@gmail.com>,
	Stephane Eranian <eranian@google.com>
Subject: Re: [PATCH 12/44] perf auxtrace: Add a heap for sorting AUX area tracing queues
Date: Tue, 21 Apr 2015 12:01:56 -0300	[thread overview]
Message-ID: <20150421150156.GE11111@kernel.org> (raw)
In-Reply-To: <1428594864-29309-13-git-send-email-adrian.hunter@intel.com>

Em Thu, Apr 09, 2015 at 06:53:52PM +0300, Adrian Hunter escreveu:
> In order to process AUX area tracing
> data in time order, the queue with data
> with the lowest timestamp must be
> processed first.  Provide a heap to
> keep track of which queue that is.
> 
> As with the queues, a decoder does not have
> to use the heap, but Intel BTS and Intel PT
> will use it.

Just judging from the description, this is like what I think should be
done in 'perf trace', i.e. take advantage of the fact that each perf
mmap buffer is time ordered and go on sorting the various "queues" by
the timestamp on its head, processing from that queue till its timestamp
is after the second most recent queue head timestamp, reinsert the queue
we've been consuming, continue with the second (now first) queue (ring
buffer).

Reading on, perhaps we can reuse this...

- Arnaldo
 
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
>  tools/perf/util/auxtrace.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++
>  tools/perf/util/auxtrace.h | 29 ++++++++++++++++
>  2 files changed, 114 insertions(+)
> 
> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
> index 78a6bf9..c2f060b 100644
> --- a/tools/perf/util/auxtrace.c
> +++ b/tools/perf/util/auxtrace.c
> @@ -361,6 +361,91 @@ void auxtrace_queues__free(struct auxtrace_queues *queues)
>  	queues->nr_queues = 0;
>  }
>  
> +static void auxtrace_heapify(struct auxtrace_heap_item *heap_array,
> +			     unsigned int pos, unsigned int queue_nr,
> +			     u64 ordinal)
> +{
> +	unsigned int parent;
> +
> +	while (pos) {
> +		parent = (pos - 1) >> 1;
> +		if (heap_array[parent].ordinal <= ordinal)
> +			break;
> +		heap_array[pos] = heap_array[parent];
> +		pos = parent;
> +	}
> +	heap_array[pos].queue_nr = queue_nr;
> +	heap_array[pos].ordinal = ordinal;
> +}
> +
> +int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr,
> +		       u64 ordinal)
> +{
> +	struct auxtrace_heap_item *heap_array;
> +
> +	if (queue_nr >= heap->heap_sz) {
> +		unsigned int heap_sz = AUXTRACE_INIT_NR_QUEUES;
> +
> +		while (heap_sz <= queue_nr)
> +			heap_sz <<= 1;
> +		heap_array = realloc(heap->heap_array,
> +				     heap_sz * sizeof(struct auxtrace_heap_item));
> +		if (!heap_array)
> +			return -ENOMEM;
> +		heap->heap_array = heap_array;
> +		heap->heap_sz = heap_sz;
> +	}
> +
> +	auxtrace_heapify(heap->heap_array, heap->heap_cnt++, queue_nr, ordinal);
> +
> +	return 0;
> +}
> +
> +void auxtrace_heap__free(struct auxtrace_heap *heap)
> +{
> +	zfree(&heap->heap_array);
> +	heap->heap_cnt = 0;
> +	heap->heap_sz = 0;
> +}
> +
> +void auxtrace_heap__pop(struct auxtrace_heap *heap)
> +{
> +	unsigned int pos, last, heap_cnt = heap->heap_cnt;
> +	struct auxtrace_heap_item *heap_array;
> +
> +	if (!heap_cnt)
> +		return;
> +
> +	heap->heap_cnt -= 1;
> +
> +	heap_array = heap->heap_array;
> +
> +	pos = 0;
> +	while (1) {
> +		unsigned int left, right;
> +
> +		left = (pos << 1) + 1;
> +		if (left >= heap_cnt)
> +			break;
> +		right = left + 1;
> +		if (right >= heap_cnt) {
> +			heap_array[pos] = heap_array[left];
> +			return;
> +		}
> +		if (heap_array[left].ordinal < heap_array[right].ordinal) {
> +			heap_array[pos] = heap_array[left];
> +			pos = left;
> +		} else {
> +			heap_array[pos] = heap_array[right];
> +			pos = right;
> +		}
> +	}
> +
> +	last = heap_cnt - 1;
> +	auxtrace_heapify(heap_array, pos, heap_array[last].queue_nr,
> +			 heap_array[last].ordinal);
> +}
> +
>  size_t auxtrace_record__info_priv_size(struct auxtrace_record *itr)
>  {
>  	if (itr)
> diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
> index c6b5981..c3514f3 100644
> --- a/tools/perf/util/auxtrace.h
> +++ b/tools/perf/util/auxtrace.h
> @@ -168,6 +168,29 @@ struct auxtrace_queues {
>  };
>  
>  /**
> + * struct auxtrace_heap_item - element of struct auxtrace_heap.
> + * @queue_nr: queue number
> + * @ordinal: value used for sorting (lowest ordinal is top of the heap) expected
> + *           to be a timestamp
> + */
> +struct auxtrace_heap_item {
> +	unsigned int		queue_nr;
> +	u64			ordinal;
> +};
> +
> +/**
> + * struct auxtrace_heap - a heap suitable for sorting AUX area tracing queues.
> + * @heap_array: the heap
> + * @heap_cnt: the number of elements in the heap
> + * @heap_sz: maximum number of elements (grows as needed)
> + */
> +struct auxtrace_heap {
> +	struct auxtrace_heap_item	*heap_array;
> +	unsigned int		heap_cnt;
> +	unsigned int		heap_sz;
> +};
> +
> +/**
>   * struct auxtrace_mmap - records an mmap of the auxtrace buffer.
>   * @base: address of mapped area
>   * @userpg: pointer to buffer's perf_event_mmap_page
> @@ -297,6 +320,12 @@ void *auxtrace_buffer__get_data(struct auxtrace_buffer *buffer, int fd);
>  void auxtrace_buffer__put_data(struct auxtrace_buffer *buffer);
>  void auxtrace_buffer__drop_data(struct auxtrace_buffer *buffer);
>  void auxtrace_buffer__free(struct auxtrace_buffer *buffer);
> +
> +int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr,
> +		       u64 ordinal);
> +void auxtrace_heap__pop(struct auxtrace_heap *heap);
> +void auxtrace_heap__free(struct auxtrace_heap *heap);
> +
>  struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist,
>  					      int *err);
>  
> -- 
> 1.9.1

  reply	other threads:[~2015-04-21 15:02 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-09 15:53 [PATCH 00/44] perf tools: Introduce an abstraction for AUX Area and Instruction Tracing Adrian Hunter
2015-04-09 15:53 ` [PATCH 01/44] perf header: Add AUX area tracing feature Adrian Hunter
2015-05-06  2:58   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 02/44] perf evlist: Add support for mmapping an AUX area buffer Adrian Hunter
2015-05-06  2:58   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 03/44] perf tools: Add user events for AUX area tracing Adrian Hunter
2015-04-20 23:06   ` Arnaldo Carvalho de Melo
2015-04-20 23:10     ` Arnaldo Carvalho de Melo
2015-04-21  9:23     ` Adrian Hunter
2015-05-06  2:59   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 04/44] perf tools: Add support for AUX area recording Adrian Hunter
2015-04-20 23:17   ` Arnaldo Carvalho de Melo
2015-05-06  2:59   ` [tip:perf/core] perf auxtrace: " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 05/44] perf record: Add basic AUX area tracing support Adrian Hunter
2015-05-06  2:59   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 06/44] perf record: Extend -m option for AUX area tracing mmap pages Adrian Hunter
2015-05-06  2:59   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 07/44] perf tools: Add a user event for AUX area tracing errors Adrian Hunter
2015-05-06  3:00   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 08/44] perf session: Add hooks to allow transparent decoding of AUX area tracing data Adrian Hunter
2015-04-21 14:41   ` Arnaldo Carvalho de Melo
2015-04-21 14:46     ` Arnaldo Carvalho de Melo
2015-05-06  3:00   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 09/44] perf session: Add instruction tracing options Adrian Hunter
2015-04-21 14:50   ` Arnaldo Carvalho de Melo
2015-04-22  6:23     ` Adrian Hunter
2015-04-23 14:08       ` Arnaldo Carvalho de Melo
2015-05-06  3:00   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 10/44] perf auxtrace: Add helpers for AUX area tracing errors Adrian Hunter
2015-05-06  3:01   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 11/44] perf auxtrace: Add helpers for queuing AUX area tracing data Adrian Hunter
2015-04-21  9:21   ` [PATCH V2 " Adrian Hunter
2015-05-06  3:01     ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 12/44] perf auxtrace: Add a heap for sorting AUX area tracing queues Adrian Hunter
2015-04-21 15:01   ` Arnaldo Carvalho de Melo [this message]
2015-05-06  3:01   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 13/44] perf auxtrace: Add processing for AUX area tracing events Adrian Hunter
2015-05-06  3:01   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 14/44] perf auxtrace: Add a hashtable for caching Adrian Hunter
2015-05-06  3:02   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 15/44] perf tools: Add member to struct dso for an instruction cache Adrian Hunter
2015-05-06  3:02   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 16/44] perf script: Add Instruction Tracing support Adrian Hunter
2015-05-06  3:02   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:53 ` [PATCH 17/44] perf script: Always allow fields 'addr' and 'cpu' for auxtrace Adrian Hunter
2015-04-09 15:53 ` [PATCH 18/44] perf report: Add Instruction Tracing support Adrian Hunter
2015-04-23 14:16   ` Arnaldo Carvalho de Melo
2015-04-09 15:53 ` [PATCH 19/44] perf inject: Re-pipe AUX area tracing events Adrian Hunter
2015-04-21  9:21   ` [PATCH V2 " Adrian Hunter
2015-05-06  3:03     ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:54 ` [PATCH 20/44] perf inject: Add Instruction Tracing support Adrian Hunter
2015-05-06  3:03   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:54 ` [PATCH 21/44] perf tools: Add AUX area tracing index Adrian Hunter
2015-04-09 15:54 ` [PATCH 22/44] perf tools: Hit all build ids when AUX area tracing Adrian Hunter
2015-04-09 15:54 ` [PATCH 23/44] perf tools: Add build option NO_AUXTRACE to exclude " Adrian Hunter
2015-04-21  9:21   ` [PATCH V2 " Adrian Hunter
2015-04-09 15:54 ` [PATCH 24/44] perf auxtrace: Add option to synthesize events for transactions Adrian Hunter
2015-04-09 15:54 ` [PATCH 25/44] perf script: Add field option 'flags' to print sample flags Adrian Hunter
2015-05-06  3:03   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:54 ` [PATCH 26/44] perf tools: Add aux_watermark member of struct perf_event_attr Adrian Hunter
2015-05-06  3:03   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-04-09 15:54 ` [PATCH 27/44] perf tools: Add support for PERF_RECORD_AUX Adrian Hunter
2015-04-09 15:54 ` [PATCH 28/44] perf tools: Add support for PERF_RECORD_ITRACE_START Adrian Hunter
2015-04-09 15:54 ` [PATCH 29/44] perf tools: Add AUX area tracing Snapshot Mode Adrian Hunter
2015-04-09 15:54 ` [PATCH 30/44] perf record: Add AUX area tracing Snapshot Mode support Adrian Hunter
2015-04-09 15:54 ` [PATCH 31/44] perf auxtrace: Add Intel PT as an AUX area tracing type Adrian Hunter
2015-04-09 15:54 ` [PATCH 32/44] perf tools: Add Intel PT packet decoder Adrian Hunter
2015-04-09 15:54 ` [PATCH 33/44] perf tools: Add Intel PT instruction decoder Adrian Hunter
2015-04-09 15:54 ` [PATCH 34/44] perf tools: Add Intel PT log Adrian Hunter
2015-04-09 15:54 ` [PATCH 35/44] perf tools: Add Intel PT decoder Adrian Hunter
2015-04-09 15:54 ` [PATCH 36/44] perf tools: Add Intel PT support Adrian Hunter
2015-04-09 15:54 ` [PATCH 37/44] perf tools: Take Intel PT into use Adrian Hunter
2015-04-09 15:54 ` [PATCH 38/44] perf tools: Allow auxtrace data alignment Adrian Hunter
2015-04-09 15:54 ` [PATCH 39/44] perf tools: Add Intel BTS support Adrian Hunter
2015-04-09 15:54 ` [PATCH 40/44] perf tools: Output sample flags and insn_len from intel_pt Adrian Hunter
2015-04-09 15:54 ` [PATCH 41/44] perf tools: Output sample flags and insn_len from intel_bts Adrian Hunter
2015-04-09 15:54 ` [PATCH 42/44] perf tools: Intel PT to always update thread stack trace number Adrian Hunter
2015-04-09 15:54 ` [PATCH 43/44] perf tools: Intel BTS " Adrian Hunter
2015-04-09 15:54 ` [PATCH 44/44] perf tools: Add example call-graph script Adrian Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150421150156.GE11111@kernel.org \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@gmail.com \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.