All of lore.kernel.org
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jiri Olsa <jolsa@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	David Ahern <dsahern@gmail.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Andi Kleen <andi@firstfloor.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Stephane Eranian <eranian@google.com>
Subject: Re: [PATCH 33/40] perf session: Separate struct machines from session
Date: Tue, 19 May 2015 16:28:15 +0900	[thread overview]
Message-ID: <20150519072815.GL21663@sejong> (raw)
In-Reply-To: <20150518125259.GE15972@kernel.org>

On Mon, May 18, 2015 at 09:52:59AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, May 18, 2015 at 09:30:48AM +0900, Namhyung Kim escreveu:
> > With multi-thread report, separate sessions can be passed to each
> > thread, in this case we should keep a single machine state for all
> > struct sessions.  Separate machines and have a pointer in sessions.
> 
> I had to look at all the patch to semi-figure this out, i.e. you said it
> should be separated from 'perf_session', agreed.
> 
> But who will create it?  How will it be passed to the perf_session
> instances?
> 
> Most of the patch is making session->machines be turned into a pointer,
> but the meat, i.e. who creates it, is unclear, I see a malloc in
> perf_session__new(), where I was kinda expecting that a higer layer,
> perhaps in struct tool? Would create the list of all machines (struct
> machines) and then pass it to multiple perf_session__new() calls.
> 
> But then perf_session__delete() calls 'free(session->machines)', huh?

OK.  So, this is what I have in my head:

  perf_tool__create_machines(tool) {
    tool->machines = malloc();
    machines__init(tool->machines);
  }

  perf_session__new(file, repipe, tool) {
    session->machines = tool->machines;
    ...
  }

  perf_tool__delete_machines(tool) {
    /* call machines-related destructors */
    free(tool->machines);
  }

Are you OK with this?

Thanks,
Namhyung


> 
> - Arnaldo
>  
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> > ---
> >  tools/perf/builtin-annotate.c |  2 +-
> >  tools/perf/builtin-kmem.c     | 10 +++++-----
> >  tools/perf/builtin-kvm.c      |  2 +-
> >  tools/perf/builtin-record.c   |  4 ++--
> >  tools/perf/builtin-report.c   |  4 ++--
> >  tools/perf/builtin-top.c      |  8 ++++----
> >  tools/perf/builtin-trace.c    |  2 +-
> >  tools/perf/util/build-id.c    | 16 ++++++++--------
> >  tools/perf/util/session.c     | 36 +++++++++++++++++++++---------------
> >  tools/perf/util/session.h     |  6 +++---
> >  10 files changed, 48 insertions(+), 42 deletions(-)
> > 
> > diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> > index 761f902473b7..d4ad323ddfe2 100644
> > --- a/tools/perf/builtin-annotate.c
> > +++ b/tools/perf/builtin-annotate.c
> > @@ -196,7 +196,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
> >  	struct perf_evsel *pos;
> >  	u64 total_nr_samples;
> >  
> > -	machines__set_symbol_filter(&session->machines, symbol__annotate_init);
> > +	machines__set_symbol_filter(session->machines, symbol__annotate_init);
> >  
> >  	if (ann->cpu_list) {
> >  		ret = perf_session__cpu_bitmap(session, ann->cpu_list,
> > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> > index 254614b10c4a..4502954094e5 100644
> > --- a/tools/perf/builtin-kmem.c
> > +++ b/tools/perf/builtin-kmem.c
> > @@ -316,7 +316,7 @@ static int build_alloc_func_list(void)
> >  	struct symbol *sym;
> >  	struct rb_node *node;
> >  	struct alloc_func *func;
> > -	struct machine *machine = &kmem_session->machines.host;
> > +	struct machine *machine = &kmem_session->machines->host;
> >  	regex_t alloc_func_regex;
> >  	const char pattern[] = "^_?_?(alloc|get_free|get_zeroed)_pages?";
> >  
> > @@ -366,7 +366,7 @@ static int build_alloc_func_list(void)
> >  static u64 find_callsite(struct perf_evsel *evsel, struct perf_sample *sample)
> >  {
> >  	struct addr_location al;
> > -	struct machine *machine = &kmem_session->machines.host;
> > +	struct machine *machine = &kmem_session->machines->host;
> >  	struct callchain_cursor_node *node;
> >  
> >  	if (alloc_func_list == NULL) {
> > @@ -949,7 +949,7 @@ static void __print_slab_result(struct rb_root *root,
> >  				int n_lines, int is_caller)
> >  {
> >  	struct rb_node *next;
> > -	struct machine *machine = &session->machines.host;
> > +	struct machine *machine = &session->machines->host;
> >  
> >  	printf("%.105s\n", graph_dotted_line);
> >  	printf(" %-34s |",  is_caller ? "Callsite": "Alloc Ptr");
> > @@ -1010,7 +1010,7 @@ static const char * const migrate_type_str[] = {
> >  static void __print_page_alloc_result(struct perf_session *session, int n_lines)
> >  {
> >  	struct rb_node *next = rb_first(&page_alloc_sorted);
> > -	struct machine *machine = &session->machines.host;
> > +	struct machine *machine = &session->machines->host;
> >  	const char *format;
> >  	int gfp_len = max(strlen("GFP flags"), max_gfp_len);
> >  
> > @@ -1060,7 +1060,7 @@ static void __print_page_alloc_result(struct perf_session *session, int n_lines)
> >  static void __print_page_caller_result(struct perf_session *session, int n_lines)
> >  {
> >  	struct rb_node *next = rb_first(&page_caller_sorted);
> > -	struct machine *machine = &session->machines.host;
> > +	struct machine *machine = &session->machines->host;
> >  	int gfp_len = max(strlen("GFP flags"), max_gfp_len);
> >  
> >  	printf("\n%.105s\n", graph_dotted_line);
> > diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
> > index 15fecd3dc5d8..de3c7e1d0b80 100644
> > --- a/tools/perf/builtin-kvm.c
> > +++ b/tools/perf/builtin-kvm.c
> > @@ -1392,7 +1392,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
> >  	kvm->session->evlist = kvm->evlist;
> >  	perf_session__set_id_hdr_size(kvm->session);
> >  	ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true);
> > -	machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target,
> > +	machine__synthesize_threads(&kvm->session->machines->host, &kvm->opts.target,
> >  				    kvm->evlist->threads, false);
> >  	err = kvm_live_open_events(kvm);
> >  	if (err)
> > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> > index 4ddf104f50ff..978ebf648aab 100644
> > --- a/tools/perf/builtin-record.c
> > +++ b/tools/perf/builtin-record.c
> > @@ -684,7 +684,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
> >  		goto out_child;
> >  	}
> >  
> > -	machine = &session->machines.host;
> > +	machine = &session->machines->host;
> >  
> >  	if (file->is_pipe) {
> >  		err = perf_event__synthesize_attrs(tool, session,
> > @@ -735,7 +735,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
> >  		       "Check /proc/modules permission or run as root.\n");
> >  
> >  	if (perf_guest) {
> > -		machines__process_guests(&session->machines,
> > +		machines__process_guests(session->machines,
> >  					 perf_event__synthesize_guest_os, tool);
> >  	}
> >  
> > diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> > index 5e53eee5a9a7..650d78ad3357 100644
> > --- a/tools/perf/builtin-report.c
> > +++ b/tools/perf/builtin-report.c
> > @@ -353,7 +353,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
> >  
> >  static void report__warn_kptr_restrict(const struct report *rep)
> >  {
> > -	struct map *kernel_map = rep->session->machines.host.vmlinux_maps[MAP__FUNCTION];
> > +	struct map *kernel_map = rep->session->machines->host.vmlinux_maps[MAP__FUNCTION];
> >  	struct kmap *kernel_kmap = kernel_map ? map__kmap(kernel_map) : NULL;
> >  
> >  	if (kernel_map == NULL ||
> > @@ -845,7 +845,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
> >  	 */
> >  	if (ui__has_annotation()) {
> >  		symbol_conf.priv_size = sizeof(struct annotation);
> > -		machines__set_symbol_filter(&session->machines,
> > +		machines__set_symbol_filter(session->machines,
> >  					    symbol__annotate_init);
> >  		/*
> >   		 * For searching by name on the "Browse map details".
> > diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
> > index ea6e7bd04f9a..0ab663e200ed 100644
> > --- a/tools/perf/builtin-top.c
> > +++ b/tools/perf/builtin-top.c
> > @@ -828,13 +828,13 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
> >  			++top->us_samples;
> >  			if (top->hide_user_symbols)
> >  				goto next_event;
> > -			machine = &session->machines.host;
> > +			machine = &session->machines->host;
> >  			break;
> >  		case PERF_RECORD_MISC_KERNEL:
> >  			++top->kernel_samples;
> >  			if (top->hide_kernel_symbols)
> >  				goto next_event;
> > -			machine = &session->machines.host;
> > +			machine = &session->machines->host;
> >  			break;
> >  		case PERF_RECORD_MISC_GUEST_KERNEL:
> >  			++top->guest_kernel_samples;
> > @@ -939,7 +939,7 @@ static int __cmd_top(struct perf_top *top)
> >  	if (top->session == NULL)
> >  		return -1;
> >  
> > -	machines__set_symbol_filter(&top->session->machines, symbol_filter);
> > +	machines__set_symbol_filter(top->session->machines, symbol_filter);
> >  
> >  	if (!objdump_path) {
> >  		ret = perf_session_env__lookup_objdump(&top->session->header.env);
> > @@ -951,7 +951,7 @@ static int __cmd_top(struct perf_top *top)
> >  	if (ret)
> >  		goto out_delete;
> >  
> > -	machine__synthesize_threads(&top->session->machines.host, &opts->target,
> > +	machine__synthesize_threads(&top->session->machines->host, &opts->target,
> >  				    top->evlist->threads, false);
> >  	ret = perf_top__start_counters(top);
> >  	if (ret)
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index a05490d06374..f3df6fa596e9 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -2418,7 +2418,7 @@ static int trace__replay(struct trace *trace)
> >  	if (symbol__init(&session->header.env) < 0)
> >  		goto out;
> >  
> > -	trace->host = &session->machines.host;
> > +	trace->host = &session->machines->host;
> >  
> >  	err = perf_session__set_tracepoints_handlers(session, handlers);
> >  	if (err)
> > diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
> > index ad8cfcbaa25d..8720f71a96dd 100644
> > --- a/tools/perf/util/build-id.c
> > +++ b/tools/perf/util/build-id.c
> > @@ -221,12 +221,12 @@ static int machine__write_buildid_table(struct machine *machine, int fd)
> >  int perf_session__write_buildid_table(struct perf_session *session, int fd)
> >  {
> >  	struct rb_node *nd;
> > -	int err = machine__write_buildid_table(&session->machines.host, fd);
> > +	int err = machine__write_buildid_table(&session->machines->host, fd);
> >  
> >  	if (err)
> >  		return err;
> >  
> > -	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
> > +	for (nd = rb_first(&session->machines->guests); nd; nd = rb_next(nd)) {
> >  		struct machine *pos = rb_entry(nd, struct machine, rb_node);
> >  		err = machine__write_buildid_table(pos, fd);
> >  		if (err)
> > @@ -261,11 +261,11 @@ int dsos__hit_all(struct perf_session *session)
> >  	struct rb_node *nd;
> >  	int err;
> >  
> > -	err = machine__hit_all_dsos(&session->machines.host);
> > +	err = machine__hit_all_dsos(&session->machines->host);
> >  	if (err)
> >  		return err;
> >  
> > -	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
> > +	for (nd = rb_first(&session->machines->guests); nd; nd = rb_next(nd)) {
> >  		struct machine *pos = rb_entry(nd, struct machine, rb_node);
> >  
> >  		err = machine__hit_all_dsos(pos);
> > @@ -509,9 +509,9 @@ int perf_session__cache_build_ids(struct perf_session *session)
> >  	if (mkdir(buildid_dir, 0755) != 0 && errno != EEXIST)
> >  		return -1;
> >  
> > -	ret = machine__cache_build_ids(&session->machines.host);
> > +	ret = machine__cache_build_ids(&session->machines->host);
> >  
> > -	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
> > +	for (nd = rb_first(&session->machines->guests); nd; nd = rb_next(nd)) {
> >  		struct machine *pos = rb_entry(nd, struct machine, rb_node);
> >  		ret |= machine__cache_build_ids(pos);
> >  	}
> > @@ -530,9 +530,9 @@ static bool machine__read_build_ids(struct machine *machine, bool with_hits)
> >  bool perf_session__read_build_ids(struct perf_session *session, bool with_hits)
> >  {
> >  	struct rb_node *nd;
> > -	bool ret = machine__read_build_ids(&session->machines.host, with_hits);
> > +	bool ret = machine__read_build_ids(&session->machines->host, with_hits);
> >  
> > -	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
> > +	for (nd = rb_first(&session->machines->guests); nd; nd = rb_next(nd)) {
> >  		struct machine *pos = rb_entry(nd, struct machine, rb_node);
> >  		ret |= machine__read_build_ids(pos, with_hits);
> >  	}
> > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> > index 0d080a95d2ff..955bf5368751 100644
> > --- a/tools/perf/util/session.c
> > +++ b/tools/perf/util/session.c
> > @@ -58,21 +58,21 @@ void perf_session__set_id_hdr_size(struct perf_session *session)
> >  {
> >  	u16 id_hdr_size = perf_evlist__id_hdr_size(session->evlist);
> >  
> > -	machines__set_id_hdr_size(&session->machines, id_hdr_size);
> > +	machines__set_id_hdr_size(session->machines, id_hdr_size);
> >  }
> >  
> >  int perf_session__create_kernel_maps(struct perf_session *session)
> >  {
> > -	int ret = machine__create_kernel_maps(&session->machines.host);
> > +	int ret = machine__create_kernel_maps(&session->machines->host);
> >  
> >  	if (ret >= 0)
> > -		ret = machines__create_guest_kernel_maps(&session->machines);
> > +		ret = machines__create_guest_kernel_maps(session->machines);
> >  	return ret;
> >  }
> >  
> >  static void perf_session__destroy_kernel_maps(struct perf_session *session)
> >  {
> > -	machines__destroy_kernel_maps(&session->machines);
> > +	machines__destroy_kernel_maps(session->machines);
> >  }
> >  
> >  static bool perf_session__has_comm_exec(struct perf_session *session)
> > @@ -91,7 +91,7 @@ static void perf_session__set_comm_exec(struct perf_session *session)
> >  {
> >  	bool comm_exec = perf_session__has_comm_exec(session);
> >  
> > -	machines__set_comm_exec(&session->machines, comm_exec);
> > +	machines__set_comm_exec(session->machines, comm_exec);
> >  }
> >  
> >  static int ordered_events__deliver_event(struct ordered_events *oe,
> > @@ -123,7 +123,12 @@ struct perf_session *perf_session__new(struct perf_data_file *file,
> >  	session->repipe = repipe;
> >  	session->tool   = tool;
> >  	INIT_LIST_HEAD(&session->auxtrace_index);
> > -	machines__init(&session->machines);
> > +
> > +	session->machines = malloc(sizeof(*session->machines));
> > +	if (!session->machines)
> > +		goto out_delete;
> > +
> > +	machines__init(session->machines);
> >  	ordered_events__init(&session->ordered_events, ordered_events__deliver_event);
> >  
> >  	if (file) {
> > @@ -168,7 +173,7 @@ struct perf_session *perf_session__new(struct perf_data_file *file,
> >  
> >  static void perf_session__delete_threads(struct perf_session *session)
> >  {
> > -	machine__delete_threads(&session->machines.host);
> > +	machine__delete_threads(&session->machines->host);
> >  }
> >  
> >  static void perf_session_env__delete(struct perf_session_env *env)
> > @@ -194,7 +199,8 @@ void perf_session__delete(struct perf_session *session)
> >  	perf_session__destroy_kernel_maps(session);
> >  	perf_session__delete_threads(session);
> >  	perf_session_env__delete(&session->header.env);
> > -	machines__exit(&session->machines);
> > +	machines__exit(session->machines);
> > +	free(session->machines);
> >  	if (session->file)
> >  		perf_data_file__close(session->file);
> >  	free(session->header.index);
> > @@ -1088,7 +1094,7 @@ static int perf_session__deliver_event(struct perf_session *session,
> >  	if (ret > 0)
> >  		return 0;
> >  
> > -	return machines__deliver_event(&session->machines, stats,
> > +	return machines__deliver_event(session->machines, stats,
> >  				       session->evlist, event, sample,
> >  				       tool, file_offset);
> >  }
> > @@ -1155,7 +1161,7 @@ int perf_session__deliver_synth_event(struct perf_session *session,
> >  	if (event->header.type >= PERF_RECORD_USER_TYPE_START)
> >  		return perf_session__process_user_event(session, event, 0);
> >  
> > -	return machines__deliver_event(&session->machines, &evlist->stats,
> > +	return machines__deliver_event(session->machines, &evlist->stats,
> >  				       evlist, event, sample, tool, 0);
> >  }
> >  
> > @@ -1270,14 +1276,14 @@ void perf_event_header__bswap(struct perf_event_header *hdr)
> >  
> >  struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
> >  {
> > -	return machine__findnew_thread(&session->machines.host, -1, pid);
> > +	return machine__findnew_thread(&session->machines->host, -1, pid);
> >  }
> >  
> >  static struct thread *perf_session__register_idle_thread(struct perf_session *session)
> >  {
> >  	struct thread *thread;
> >  
> > -	thread = machine__findnew_thread(&session->machines.host, 0, 0);
> > +	thread = machine__findnew_thread(&session->machines->host, 0, 0);
> >  	if (thread == NULL || thread__set_comm(thread, "swapper", 0)) {
> >  		pr_err("problem inserting idle task.\n");
> >  		thread = NULL;
> > @@ -1692,13 +1698,13 @@ int maps__set_kallsyms_ref_reloc_sym(struct map **maps,
> >  
> >  size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
> >  {
> > -	return machines__fprintf_dsos(&session->machines, fp);
> > +	return machines__fprintf_dsos(session->machines, fp);
> >  }
> >  
> >  size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
> >  					  bool (skip)(struct dso *dso, int parm), int parm)
> >  {
> > -	return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
> > +	return machines__fprintf_dsos_buildid(session->machines, fp, skip, parm);
> >  }
> >  
> >  size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
> > @@ -1721,7 +1727,7 @@ size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
> >  	 * FIXME: Here we have to actually print all the machines in this
> >  	 * session, not just the host...
> >  	 */
> > -	return machine__fprintf(&session->machines.host, fp);
> > +	return machine__fprintf(&session->machines->host, fp);
> >  }
> >  
> >  struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
> > diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> > index b44afc75d1cc..ac1796c7c799 100644
> > --- a/tools/perf/util/session.h
> > +++ b/tools/perf/util/session.h
> > @@ -20,7 +20,7 @@ struct itrace_synth_opts;
> >  
> >  struct perf_session {
> >  	struct perf_header	header;
> > -	struct machines		machines;
> > +	struct machines		*machines;
> >  	struct perf_evlist	*evlist;
> >  	struct auxtrace		*auxtrace;
> >  	struct itrace_synth_opts *itrace_synth_opts;
> > @@ -79,13 +79,13 @@ void perf_session__set_id_hdr_size(struct perf_session *session);
> >  static inline
> >  struct machine *perf_session__find_machine(struct perf_session *session, pid_t pid)
> >  {
> > -	return machines__find(&session->machines, pid);
> > +	return machines__find(session->machines, pid);
> >  }
> >  
> >  static inline
> >  struct machine *perf_session__findnew_machine(struct perf_session *session, pid_t pid)
> >  {
> > -	return machines__findnew(&session->machines, pid);
> > +	return machines__findnew(session->machines, pid);
> >  }
> >  
> >  struct thread *perf_session__findnew(struct perf_session *session, pid_t pid);
> > -- 
> > 2.4.0
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

  reply	other threads:[~2015-05-19  7:37 UTC|newest]

Thread overview: 221+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-18  0:30 [RFC/PATCHSET 00/40] perf tools: Speed-up perf report by using multi thread (v4) Namhyung Kim
2015-05-18  0:30 ` [PATCH 01/40] perf tools: Use a software dummy event to track task/mmap events Namhyung Kim
2015-05-18  0:30 ` [PATCH 02/40] perf tools: Add rm_rf() utility function Namhyung Kim
2015-05-18  0:30 ` [PATCH 03/40] perf tools: Introduce copyfile_offset() function Namhyung Kim
2015-05-18 12:57   ` Arnaldo Carvalho de Melo
2015-05-19  6:20     ` Namhyung Kim
2015-05-20 12:24   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-05-18  0:30 ` [PATCH 04/40] perf tools: Create separate mmap for dummy tracking event Namhyung Kim
2015-05-18 18:07   ` Jiri Olsa
2015-05-19  6:24     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 05/40] perf tools: Introduce perf_evlist__mmap_track() Namhyung Kim
2015-05-18 18:09   ` Jiri Olsa
2015-05-19  6:28     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 06/40] perf tools: Add HEADER_DATA_INDEX feature Namhyung Kim
2015-05-18 18:17   ` Jiri Olsa
2015-05-19  6:34     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 07/40] perf tools: Handle indexed data file properly Namhyung Kim
2015-05-18 18:37   ` Jiri Olsa
2015-05-19  6:40     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 08/40] perf record: Add --index option for building index table Namhyung Kim
2015-05-18  0:30 ` [PATCH 09/40] perf report: Skip dummy tracking event Namhyung Kim
2015-05-18  0:30 ` [PATCH 10/40] perf tools: Introduce thread__comm(_str)_by_time() helpers Namhyung Kim
2015-05-18  0:30 ` [PATCH 11/40] perf tools: Add a test case for thread comm handling Namhyung Kim
2015-05-18 19:29   ` Jiri Olsa
2015-05-19  6:42     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 12/40] perf tools: Use thread__comm_by_time() when adding hist entries Namhyung Kim
2015-05-18  0:30 ` [PATCH 13/40] perf tools: Convert dead thread list into rbtree Namhyung Kim
2015-05-18 19:34   ` Jiri Olsa
2015-05-19  6:45     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 14/40] perf tools: Introduce machine__find*_thread_by_time() Namhyung Kim
2015-05-18 19:50   ` Jiri Olsa
2015-05-18 19:56     ` Jiri Olsa
2015-05-19  6:57     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 15/40] perf tools: Add a test case for timed thread handling Namhyung Kim
2015-05-18  0:30 ` [PATCH 16/40] perf tools: Reducing arguments of hist_entry_iter__add() Namhyung Kim
2015-05-18 12:55   ` Arnaldo Carvalho de Melo
2015-05-19  7:01     ` Namhyung Kim
2015-05-19  8:04       ` [PATCH] " Namhyung Kim
2015-05-19 14:03         ` Arnaldo Carvalho de Melo
2015-05-27 16:47         ` [tip:perf/core] perf hists: " tip-bot for Namhyung Kim
2015-05-18  0:30 ` [PATCH 17/40] perf tools: Maintain map groups list in a leader thread Namhyung Kim
2015-05-18  0:30 ` [PATCH 18/40] perf tools: Introduce thread__find_addr_location_by_time() and friends Namhyung Kim
2015-05-18  0:30 ` [PATCH 19/40] perf callchain: Use " Namhyung Kim
2015-05-18  0:30 ` [PATCH 20/40] perf tools: Add a test case for timed map groups handling Namhyung Kim
2015-05-18  0:30 ` [PATCH 21/40] perf tools: Save timestamp of a map creation Namhyung Kim
2015-05-18  0:30 ` [PATCH 22/40] perf tools: Introduce map_groups__{insert,find}_by_time() Namhyung Kim
2015-05-18  0:30 ` [PATCH 23/40] perf tools: Use map_groups__find_addr_by_time() Namhyung Kim
2015-05-18  0:30 ` [PATCH 24/40] perf tools: Add testcase for managing maps with time Namhyung Kim
2015-05-18  0:30 ` [PATCH 25/40] perf tools: Protect dso symbol loading using a mutex Namhyung Kim
2015-05-20 12:25   ` [tip:perf/core] perf symbols: " tip-bot for Namhyung Kim
2015-05-18  0:30 ` [PATCH 26/40] perf tools: Protect dso cache tree using dso->lock Namhyung Kim
2015-05-20 12:25   ` [tip:perf/core] perf symbols: Protect dso cache tree using dso-> lock tip-bot for Namhyung Kim
2015-05-18  0:30 ` [PATCH 27/40] perf tools: Protect dso cache fd with a mutex Namhyung Kim
2015-05-20 12:25   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-05-18  0:30 ` [PATCH 28/40] perf callchain: Maintain libunwind's address space in map_groups Namhyung Kim
2015-05-18  0:30 ` [PATCH 29/40] perf tools: Add dso__data_get/put_fd() Namhyung Kim
2015-05-18  0:30 ` [PATCH 30/40] perf session: Pass struct events stats to event processing functions Namhyung Kim
2015-05-18  0:30 ` [PATCH 31/40] perf hists: Pass hists struct to hist_entry_iter struct Namhyung Kim
2015-05-18  0:30 ` [PATCH 32/40] perf tools: Move BUILD_ID_SIZE definition to perf.h Namhyung Kim
2015-05-18  0:30 ` [PATCH 33/40] perf session: Separate struct machines from session Namhyung Kim
2015-05-18 12:52   ` Arnaldo Carvalho de Melo
2015-05-19  7:28     ` Namhyung Kim [this message]
2015-05-19 22:46       ` Arnaldo Carvalho de Melo
2015-05-19 23:58         ` Namhyung Kim
2015-05-28  2:39           ` [RFC 0/2] " Namhyung Kim
2015-05-28  2:39             ` [PATCH 1/2] perf tools: Introduce machines__new/delete() Namhyung Kim
2015-05-28  2:39             ` [PATCH 2/2] perf session: Separate struct machines from session Namhyung Kim
2015-05-18  0:30 ` [PATCH 34/40] perf report: Parallelize perf report using multi-thread Namhyung Kim
2015-05-19 10:12   ` Jiri Olsa
2015-05-19 14:58     ` Namhyung Kim
2015-05-18  0:30 ` [PATCH 35/40] perf record: Synthesize COMM event for a command line workload Namhyung Kim
2015-05-18 12:45   ` Arnaldo Carvalho de Melo
2015-05-19  7:46     ` Namhyung Kim
2015-05-19 14:02       ` Arnaldo Carvalho de Melo
2015-05-19 15:12         ` Namhyung Kim
2015-05-19 16:30           ` Arnaldo Carvalho de Melo
2015-05-19 19:49           ` Jiri Olsa
2015-05-19 20:18             ` Arnaldo Carvalho de Melo
2015-05-19 23:56               ` Namhyung Kim
2015-05-20  0:22                 ` Arnaldo Carvalho de Melo
2015-05-20  0:56                   ` Namhyung Kim
2015-05-20  1:16                     ` Arnaldo Carvalho de Melo
2015-05-18  0:30 ` [PATCH 36/40] perf tools: Fix progress ui to support multi thread Namhyung Kim
2015-05-18  0:30 ` [PATCH 37/40] perf report: Add --multi-thread option and config item Namhyung Kim
2015-05-18  0:30 ` [PATCH 38/40] perf session: Handle index files generally Namhyung Kim
2015-05-19 22:27   ` David Ahern
2015-05-20  0:05     ` Namhyung Kim
2015-05-20  7:20       ` [PATCH 41/40] perf report: Add --num-thread option to control number of thread Namhyung Kim
2015-05-18  0:30 ` [PATCH 39/40] perf data: Implement 'index' subcommand Namhyung Kim
2015-05-18  0:30 ` [PATCH Not-for-merge 40/40] perf tools: Disable thread refcount due to bug Namhyung Kim
2015-05-18  1:23   ` Arnaldo Carvalho de Melo
2015-05-18 12:21     ` Namhyung Kim
2015-05-18 12:30       ` Arnaldo Carvalho de Melo
  -- strict thread matches above, loose matches on Subject: below --
2015-03-03  3:07 [RFC/PATCHSET 00/38] perf tools: Speed-up perf report by using multi thread (v3) Namhyung Kim
2015-03-03  3:07 ` [PATCH 01/38] perf tools: Use a software dummy event to track task/mmap events Namhyung Kim
2015-03-03  3:07 ` [PATCH 02/38] perf tools: Add rm_rf() utility function Namhyung Kim
2015-03-03  3:07 ` [PATCH 03/38] perf tools: Introduce copyfile_offset() function Namhyung Kim
2015-03-04 14:58   ` Jiri Olsa
2015-03-03  3:07 ` [PATCH 04/38] perf tools: Create separate mmap for dummy tracking event Namhyung Kim
2015-03-03  3:07 ` [PATCH 05/38] perf tools: Introduce perf_evlist__mmap_track() Namhyung Kim
2015-03-03  3:07 ` [PATCH 06/38] perf tools: Add HEADER_DATA_INDEX feature Namhyung Kim
2015-03-03  3:07 ` [PATCH 07/38] perf tools: Handle indexed data file properly Namhyung Kim
2015-03-04 16:19   ` Jiri Olsa
2015-03-06  4:17     ` Namhyung Kim
2015-03-03  3:07 ` [PATCH 08/38] perf record: Add --index option for building index table Namhyung Kim
2015-03-05  7:56   ` Jiri Olsa
2015-03-06  4:19     ` Namhyung Kim
2015-03-03  3:07 ` [PATCH 09/38] perf report: Skip dummy tracking event Namhyung Kim
2015-03-03  3:07 ` [PATCH 10/38] perf tools: Pass session arg to perf_event__preprocess_sample() Namhyung Kim
2015-03-03 13:59   ` Arnaldo Carvalho de Melo
2015-03-03 14:18     ` Namhyung Kim
2015-03-03  3:07 ` [PATCH 11/38] perf script: Pass session arg to ->process_event callback Namhyung Kim
2015-03-03  3:07 ` [PATCH 12/38] perf tools: Introduce thread__comm_time() helpers Namhyung Kim
2015-03-03 16:28   ` Frederic Weisbecker
2015-03-04  0:02     ` Namhyung Kim
2015-03-05 16:08       ` Frederic Weisbecker
2015-03-06  4:38         ` Namhyung Kim
2015-03-06 12:48           ` Arnaldo Carvalho de Melo
2015-03-10  6:55             ` Namhyung Kim
2015-03-03  3:07 ` [PATCH 13/38] perf tools: Add a test case for thread comm handling Namhyung Kim
2015-03-03  3:07 ` [PATCH 14/38] perf tools: Use thread__comm_time() when adding hist entries Namhyung Kim
2015-03-03  3:07 ` [PATCH 15/38] perf tools: Convert dead thread list into rbtree Namhyung Kim
2015-03-03  3:07 ` [PATCH 16/38] perf tools: Introduce machine__find*_thread_time() Namhyung Kim
2015-03-03  3:07 ` [PATCH 17/38] perf tools: Add a test case for timed thread handling Namhyung Kim
2015-03-03  3:07 ` [PATCH 18/38] perf tools: Reducing arguments of hist_entry_iter__add() Namhyung Kim
2015-03-03  3:07 ` [PATCH 19/38] perf tools: Pass session to hist_entry_iter struct Namhyung Kim
2015-03-03  3:07 ` [PATCH 20/38] perf tools: Maintain map groups list in a leader thread Namhyung Kim
2015-03-03  3:07 ` [PATCH 21/38] perf tools: Introduce session__find_addr_location() and friends Namhyung Kim
2015-03-03  3:07 ` [PATCH 22/38] perf callchain: Use " Namhyung Kim
2015-03-03 14:01   ` Arnaldo Carvalho de Melo
2015-03-03  3:07 ` [PATCH 23/38] perf tools: Add a test case for timed map groups handling Namhyung Kim
2015-03-03  3:07 ` [PATCH 24/38] perf tools: Protect dso symbol loading using a mutex Namhyung Kim
2015-03-03  3:07 ` [PATCH 25/38] perf tools: Protect dso cache tree using dso->lock Namhyung Kim
2015-03-03  3:07 ` [PATCH 26/38] perf tools: Protect dso cache fd with a mutex Namhyung Kim
2015-03-03  3:07 ` [PATCH 27/38] perf callchain: Maintain libunwind's address space in map_groups Namhyung Kim
2015-03-03  3:07 ` [PATCH 28/38] perf tools: Add dso__data_get/put_fd() Namhyung Kim
2015-03-03  3:07 ` [PATCH 29/38] perf session: Pass struct events stats to event processing functions Namhyung Kim
2015-03-03  3:07 ` [PATCH 30/38] perf hists: Pass hists struct to hist_entry_iter struct Namhyung Kim
2015-03-03  3:07 ` [PATCH 31/38] perf tools: Move BUILD_ID_SIZE definition to perf.h Namhyung Kim
2015-03-03  3:07 ` [PATCH 32/38] perf report: Parallelize perf report using multi-thread Namhyung Kim
2015-03-03  3:07 ` [PATCH 33/38] perf tools: Add missing_threads rb tree Namhyung Kim
2015-03-03  3:07 ` [PATCH 34/38] perf record: Synthesize COMM event for a command line workload Namhyung Kim
2015-03-03  3:07 ` [PATCH 35/38] perf tools: Fix progress ui to support multi thread Namhyung Kim
2015-03-03  3:07 ` [PATCH 36/38] perf report: Add --multi-thread option and config item Namhyung Kim
2015-03-03  3:07 ` [PATCH 37/38] perf session: Handle index files generally Namhyung Kim
2015-03-03  3:07 ` [PATCH 38/38] perf data: Implement 'index' subcommand Namhyung Kim
2015-01-29  8:06 [RFC/PATCHSET 00/42] perf tools: Speed-up perf report by using multi thread (v2) Namhyung Kim
2015-01-29  8:06 ` [PATCH 01/42] perf tools: Support to read compressed module from build-id cache Namhyung Kim
2015-01-30 14:32   ` Jiri Olsa
2015-02-02 15:03     ` Namhyung Kim
2015-01-30 18:33   ` [tip:perf/core] perf symbols: " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 02/42] perf tools: Do not use __perf_session__process_events() directly Namhyung Kim
2015-01-30 18:32   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 03/42] perf record: Show precise number of samples Namhyung Kim
2015-01-30 18:32   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 04/42] perf header: Set header version correctly Namhyung Kim
2015-01-30 18:33   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 05/42] perf tools: Set attr.task bit for a tracking event Namhyung Kim
2015-01-30 18:33   ` [tip:perf/core] perf evsel: " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 06/42] perf tools: Use a software dummy event to track task/mmap events Namhyung Kim
2015-01-29  8:06 ` [PATCH 07/42] perf tools: Use perf_data_file__fd() consistently Namhyung Kim
2015-01-30 18:33   ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 08/42] perf tools: Add rm_rf() utility function Namhyung Kim
2015-01-30 15:02   ` Jiri Olsa
2015-05-20 12:24     ` [tip:perf/core] " tip-bot for Namhyung Kim
2015-01-29  8:06 ` [PATCH 09/42] perf tools: Introduce copyfile_offset() function Namhyung Kim
2015-01-29  8:06 ` [PATCH 10/42] perf tools: Create separate mmap for dummy tracking event Namhyung Kim
2015-01-29  8:06 ` [PATCH 11/42] perf tools: Introduce perf_evlist__mmap_track() Namhyung Kim
2015-01-29  8:06 ` [PATCH 12/42] perf tools: Add HEADER_DATA_INDEX feature Namhyung Kim
2015-01-29  8:06 ` [PATCH 13/42] perf tools: Handle indexed data file properly Namhyung Kim
2015-01-29  8:06 ` [PATCH 14/42] perf record: Add --index option for building index table Namhyung Kim
2015-02-01 18:06   ` Jiri Olsa
2015-02-02  8:34     ` Adrian Hunter
2015-02-02  9:15       ` Jiri Olsa
2015-02-02  9:52         ` Adrian Hunter
2015-02-02 10:05           ` Jiri Olsa
2015-02-02 12:07             ` Adrian Hunter
2015-02-02 12:13               ` Jiri Olsa
2015-02-02 14:56                 ` Namhyung Kim
2015-02-02 17:30                   ` Jiri Olsa
2015-02-03  8:42                     ` Adrian Hunter
2015-01-29  8:06 ` [PATCH 15/42] perf report: Skip dummy tracking event Namhyung Kim
2015-01-29  8:06 ` [PATCH 16/42] perf tools: Pass session arg to perf_event__preprocess_sample() Namhyung Kim
2015-01-29  8:06 ` [PATCH 17/42] perf script: Pass session arg to ->process_event callback Namhyung Kim
2015-01-29  8:06 ` [PATCH 18/42] perf tools: Introduce thread__comm_time() helpers Namhyung Kim
2015-01-29  8:07 ` [PATCH 19/42] perf tools: Add a test case for thread comm handling Namhyung Kim
2015-01-29  8:07 ` [PATCH 20/42] perf tools: Use thread__comm_time() when adding hist entries Namhyung Kim
2015-01-29  8:07 ` [PATCH 21/42] perf tools: Convert dead thread list into rbtree Namhyung Kim
2015-01-29  8:07 ` [PATCH 22/42] perf tools: Introduce machine__find*_thread_time() Namhyung Kim
2015-01-29  8:07 ` [PATCH 23/42] perf tools: Add a test case for timed thread handling Namhyung Kim
2015-01-29  8:07 ` [PATCH 24/42] perf tools: Maintain map groups list in a leader thread Namhyung Kim
2015-01-29  8:07 ` [PATCH 25/42] perf tools: Introduce thread__find_addr_location_time() and friends Namhyung Kim
2015-01-29  8:07 ` [PATCH 26/42] perf tools: Add a test case for timed map groups handling Namhyung Kim
2015-01-29  8:07 ` [PATCH 27/42] perf tools: Protect dso symbol loading using a mutex Namhyung Kim
2015-01-29 12:34   ` Arnaldo Carvalho de Melo
2015-01-29 12:48     ` Namhyung Kim
2015-01-29  8:07 ` [PATCH 28/42] perf tools: Protect dso cache tree using dso->lock Namhyung Kim
2015-01-29  8:07 ` [PATCH 29/42] perf tools: Protect dso cache fd with a mutex Namhyung Kim
2015-01-29 12:31   ` Arnaldo Carvalho de Melo
2015-01-29 13:19     ` Namhyung Kim
2015-01-29 16:23       ` Arnaldo Carvalho de Melo
2015-01-30  0:51         ` Namhyung Kim
2015-01-29  8:07 ` [PATCH 30/42] perf session: Pass struct events stats to event processing functions Namhyung Kim
2015-01-29  8:07 ` [PATCH 31/42] perf hists: Pass hists struct to hist_entry_iter functions Namhyung Kim
2015-01-29  8:07 ` [PATCH 32/42] perf tools: Move BUILD_ID_SIZE definition to perf.h Namhyung Kim
2015-01-29  8:07 ` [PATCH 33/42] perf report: Parallelize perf report using multi-thread Namhyung Kim
2015-01-29  8:07 ` [PATCH 34/42] perf tools: Add missing_threads rb tree Namhyung Kim
2015-01-29  8:07 ` [PATCH 35/42] perf record: Synthesize COMM event for a command line workload Namhyung Kim
2015-01-29  8:07 ` [PATCH 36/42] perf tools: Fix progress ui to support multi thread Namhyung Kim
2015-01-29  8:07 ` [PATCH 37/42] perf report: Add --multi-thread option and config item Namhyung Kim
2015-01-29  8:07 ` [PATCH 38/42] perf session: Handle index files generally Namhyung Kim
2015-01-29  8:07 ` [PATCH 39/42] perf tools: Convert lseek + read to pread Namhyung Kim
2015-01-30 18:34   ` [tip:perf/core] perf symbols: " tip-bot for Namhyung Kim
2015-01-29  8:07 ` [PATCH 40/42] perf callchain: Save eh/debug frame offset for dwarf unwind Namhyung Kim
2015-01-29 12:38   ` Arnaldo Carvalho de Melo
2015-01-29 13:23     ` Namhyung Kim
2015-01-29 19:22   ` Arnaldo Carvalho de Melo
2015-01-30 18:32   ` [tip:perf/core] perf callchain: Cache eh/ debug " tip-bot for Namhyung Kim
2015-01-29  8:07 ` [PATCH 41/42] perf tools: Add new perf data command Namhyung Kim
2015-01-29  8:07 ` [PATCH 42/42] perf data: Implement 'index' subcommand Namhyung Kim
2015-01-29 19:56 ` [RFC/PATCHSET 00/42] perf tools: Speed-up perf report by using multi thread (v2) Arnaldo Carvalho de Melo

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=20150519072815.GL21663@sejong \
    --to=namhyung@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=andi@firstfloor.org \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.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.