diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-03-15 15:44:01 -0300 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-03-23 19:28:58 -0300 | 
| commit | 9e69c210822c4035708a6111567c96364ca244d5 (patch) | |
| tree | 3bae4b7f4309ec18bf4628b81cf85bb1570f6a31 | |
| parent | 880f57318450dbead6a03f9e31a1468924d6dd88 (diff) | |
| download | blackbird-op-linux-9e69c210822c4035708a6111567c96364ca244d5.tar.gz blackbird-op-linux-9e69c210822c4035708a6111567c96364ca244d5.zip  | |
perf session: Pass evsel in event_ops->sample()
Resolving the sample->id to an evsel since the most advanced tools,
report and annotate, and the others will too when they evolve to
properly support multi-event perf.data files.
Good also because it does an extra validation, checking that the ID is
valid when present. When that is not the case, the overhead is just a
branch + function call (perf_evlist__id2evsel).
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/builtin-annotate.c | 18 | ||||
| -rw-r--r-- | tools/perf/builtin-diff.c | 1 | ||||
| -rw-r--r-- | tools/perf/builtin-inject.c | 11 | ||||
| -rw-r--r-- | tools/perf/builtin-kmem.c | 1 | ||||
| -rw-r--r-- | tools/perf/builtin-lock.c | 4 | ||||
| -rw-r--r-- | tools/perf/builtin-report.c | 19 | ||||
| -rw-r--r-- | tools/perf/builtin-sched.c | 1 | ||||
| -rw-r--r-- | tools/perf/builtin-script.c | 15 | ||||
| -rw-r--r-- | tools/perf/builtin-timechart.c | 11 | ||||
| -rw-r--r-- | tools/perf/util/build-id.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/hist.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/scripting-engines/trace-event-perl.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 25 | ||||
| -rw-r--r-- | tools/perf/util/session.h | 7 | ||||
| -rw-r--r-- | tools/perf/util/trace-event-scripting.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/trace-event.h | 1 | 
17 files changed, 73 insertions, 46 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 695de4b5ae63..e18eb7ed30ae 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -42,9 +42,9 @@ static const char *sym_hist_filter;  static int perf_evlist__add_sample(struct perf_evlist *evlist,  				   struct perf_sample *sample, +				   struct perf_evsel *evsel,  				   struct addr_location *al)  { -	struct perf_evsel *evsel;  	struct hist_entry *he;  	int ret; @@ -59,18 +59,6 @@ static int perf_evlist__add_sample(struct perf_evlist *evlist,  		return 0;  	} -	evsel = perf_evlist__id2evsel(evlist, sample->id); -	if (evsel == NULL) { -		/* -		 * FIXME: Propagate this back, but at least we're in a builtin, -		 * where exit() is allowed. ;-) -		 */ -		ui__warning("Invalid %s file, contains samples with id not in " -			    "its header!\n", input_name); -		exit_browser(0); -		exit(1); -	} -  	he = __hists__add_entry(&evsel->hists, al, NULL, 1);  	if (he == NULL)  		return -ENOMEM; @@ -92,6 +80,7 @@ static int perf_evlist__add_sample(struct perf_evlist *evlist,  static int process_sample_event(union perf_event *event,  				struct perf_sample *sample, +				struct perf_evsel *evsel,  				struct perf_session *session)  {  	struct addr_location al; @@ -103,7 +92,8 @@ static int process_sample_event(union perf_event *event,  		return -1;  	} -	if (!al.filtered && perf_evlist__add_sample(session->evlist, sample, &al)) { +	if (!al.filtered && +	    perf_evlist__add_sample(session->evlist, sample, evsel, &al)) {  		pr_warning("problem incrementing symbol count, "  			   "skipping event\n");  		return -1; diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 6b7d91160ecb..e8219990f8b8 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -32,6 +32,7 @@ static int hists__add_entry(struct hists *self,  static int diff__process_sample_event(union perf_event *event,  				      struct perf_sample *sample, +				      struct perf_evsel *evsel __used,  				      struct perf_session *session)  {  	struct addr_location al; diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index e29f04ed3396..8dfc12bb119b 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -43,6 +43,14 @@ static int perf_event__repipe(union perf_event *event,  	return perf_event__repipe_synth(event, session);  } +static int perf_event__repipe_sample(union perf_event *event, +			      struct perf_sample *sample __used, +			      struct perf_evsel *evsel __used, +			      struct perf_session *session) +{ +	return perf_event__repipe_synth(event, session); +} +  static int perf_event__repipe_mmap(union perf_event *event,  				   struct perf_sample *sample,  				   struct perf_session *session) @@ -124,6 +132,7 @@ static int dso__inject_build_id(struct dso *self, struct perf_session *session)  static int perf_event__inject_buildid(union perf_event *event,  				      struct perf_sample *sample, +				      struct perf_evsel *evsel __used,  				      struct perf_session *session)  {  	struct addr_location al; @@ -164,7 +173,7 @@ repipe:  }  struct perf_event_ops inject_ops = { -	.sample		= perf_event__repipe, +	.sample		= perf_event__repipe_sample,  	.mmap		= perf_event__repipe,  	.comm		= perf_event__repipe,  	.fork		= perf_event__repipe, diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 7f618f4e7b79..225e963df105 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -305,6 +305,7 @@ static void process_raw_event(union perf_event *raw_event __used, void *data,  static int process_sample_event(union perf_event *event,  				struct perf_sample *sample, +				struct perf_evsel *evsel __used,  				struct perf_session *session)  {  	struct thread *thread = perf_session__findnew(session, event->ip.pid); diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 7a2a79d2cf2c..9ac05aafd9b2 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -845,7 +845,9 @@ static void dump_info(void)  		die("Unknown type of information\n");  } -static int process_sample_event(union perf_event *event, struct perf_sample *sample, +static int process_sample_event(union perf_event *event, +				struct perf_sample *sample, +				struct perf_evsel *evsel __used,  				struct perf_session *s)  {  	struct thread *thread = perf_session__findnew(s, sample->tid); diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index b1b82009ab9b..498c6f70a747 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -50,12 +50,12 @@ static symbol_filter_t	annotate_init;  static int perf_session__add_hist_entry(struct perf_session *session,  					struct addr_location *al, -					struct perf_sample *sample) +					struct perf_sample *sample, +					struct perf_evsel *evsel)  {  	struct symbol *parent = NULL;  	int err = 0;  	struct hist_entry *he; -	struct perf_evsel *evsel;  	if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {  		err = perf_session__resolve_callchain(session, al->thread, @@ -64,18 +64,6 @@ static int perf_session__add_hist_entry(struct perf_session *session,  			return err;  	} -	evsel = perf_evlist__id2evsel(session->evlist, sample->id); -	if (evsel == NULL) { -		/* -		 * FIXME: Propagate this back, but at least we're in a builtin, -		 * where exit() is allowed. ;-) -		 */ -		ui__warning("Invalid %s file, contains samples with id %" PRIu64 " not in " -			    "its header!\n", input_name, sample->id); -		exit_browser(0); -		exit(1); -	} -  	he = __hists__add_entry(&evsel->hists, al, parent, sample->period);  	if (he == NULL)  		return -ENOMEM; @@ -113,6 +101,7 @@ out:  static int process_sample_event(union perf_event *event,  				struct perf_sample *sample, +				struct perf_evsel *evsel,  				struct perf_session *session)  {  	struct addr_location al; @@ -127,7 +116,7 @@ static int process_sample_event(union perf_event *event,  	if (al.filtered || (hide_unresolved && al.sym == NULL))  		return 0; -	if (perf_session__add_hist_entry(session, &al, sample)) { +	if (perf_session__add_hist_entry(session, &al, sample, evsel)) {  		pr_debug("problem incrementing symbol period, skipping event\n");  		return -1;  	} diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index a32f411faeac..dcfe8873c9a1 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1603,6 +1603,7 @@ static void process_raw_event(union perf_event *raw_event __used,  static int process_sample_event(union perf_event *event,  				struct perf_sample *sample, +				struct perf_evsel *evsel __used,  				struct perf_session *session)  {  	struct thread *thread; diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 9f5fc5492141..ac574ea23917 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -162,19 +162,11 @@ static void print_sample_start(struct perf_sample *sample,  static void process_event(union perf_event *event __unused,  			  struct perf_sample *sample, +			  struct perf_evsel *evsel,  			  struct perf_session *session,  			  struct thread *thread)  { -	struct perf_event_attr *attr; -	struct perf_evsel *evsel; - -	evsel = perf_evlist__id2evsel(session->evlist, sample->id); -	if (evsel == NULL) { -		pr_err("Invalid data. Contains samples with id not in " -		       "its header!\n"); -		return; -	} -	attr = &evsel->attr; +	struct perf_event_attr *attr = &evsel->attr;  	if (output_fields[attr->type] == 0)  		return; @@ -244,6 +236,7 @@ static char const		*input_name = "perf.data";  static int process_sample_event(union perf_event *event,  				struct perf_sample *sample, +				struct perf_evsel *evsel,  				struct perf_session *session)  {  	struct thread *thread = perf_session__findnew(session, event->ip.pid); @@ -264,7 +257,7 @@ static int process_sample_event(union perf_event *event,  		last_timestamp = sample->time;  		return 0;  	} -	scripting_ops->process_event(event, sample, session, thread); +	scripting_ops->process_event(event, sample, evsel, session, thread);  	session->hists.stats.total_period += sample->period;  	return 0; diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 67c0459dc325..aa26f4d66d10 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c @@ -488,6 +488,7 @@ static void sched_switch(int cpu, u64 timestamp, struct trace_entry *te)  static int process_sample_event(union perf_event *event __used,  				struct perf_sample *sample, +				struct perf_evsel *evsel __used,  				struct perf_session *session)  {  	struct trace_entry *te; @@ -506,6 +507,16 @@ static int process_sample_event(union perf_event *event __used,  		struct power_entry_old *peo;  		peo = (void *)te;  #endif +		/* +		 * FIXME: use evsel, its already mapped from id to perf_evsel, +		 * remove perf_header__find_event infrastructure bits. +		 * Mapping all these "power:cpu_idle" strings to the tracepoint +		 * ID and then just comparing against evsel->attr.config. +		 * +		 * e.g.: +		 * +		 * if (evsel->attr.config == power_cpu_idle_id) +		 */  		event_str = perf_header__find_event(te->type);  		if (!event_str) diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 31f934af9861..a91cd99f26ea 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -16,6 +16,7 @@  static int build_id__mark_dso_hit(union perf_event *event,  				  struct perf_sample *sample __used, +				  struct perf_evsel *evsel __used,  				  struct perf_session *session)  {  	struct addr_location al; diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index cb6858a2f9a3..3beb97c4d822 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -29,6 +29,7 @@ struct events_stats {  	u32 nr_events[PERF_RECORD_HEADER_MAX];  	u32 nr_unknown_events;  	u32 nr_invalid_chains; +	u32 nr_unknown_id;  };  enum hist_column { diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c index 621427212e86..74350ffb57fe 100644 --- a/tools/perf/util/scripting-engines/trace-event-perl.c +++ b/tools/perf/util/scripting-engines/trace-event-perl.c @@ -247,6 +247,7 @@ static inline struct event *find_cache_event(int type)  static void perl_process_event(union perf_event *pevent __unused,  			       struct perf_sample *sample, +			       struct perf_evsel *evsel,  			       struct perf_session *session __unused,  			       struct thread *thread)  { diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 1b85d6055159..6ccf70e8d8f2 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -206,6 +206,7 @@ static inline struct event *find_cache_event(int type)  static void python_process_event(union perf_event *pevent __unused,  				 struct perf_sample *sample, +				 struct perf_evsel *evsel __unused,  				 struct perf_session *session __unused,  				 struct thread *thread)  { diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index c68cf40764f9..caa224522fea 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -280,6 +280,15 @@ static int process_event_synth_stub(union perf_event *event __used,  	return 0;  } +static int process_event_sample_stub(union perf_event *event __used, +				     struct perf_sample *sample __used, +				     struct perf_evsel *evsel __used, +				     struct perf_session *session __used) +{ +	dump_printf(": unhandled!\n"); +	return 0; +} +  static int process_event_stub(union perf_event *event __used,  			      struct perf_sample *sample __used,  			      struct perf_session *session __used) @@ -303,7 +312,7 @@ static int process_finished_round(union perf_event *event,  static void perf_event_ops__fill_defaults(struct perf_event_ops *handler)  {  	if (handler->sample == NULL) -		handler->sample = process_event_stub; +		handler->sample = process_event_sample_stub;  	if (handler->mmap == NULL)  		handler->mmap = process_event_stub;  	if (handler->comm == NULL) @@ -698,12 +707,19 @@ static int perf_session_deliver_event(struct perf_session *session,  				      struct perf_event_ops *ops,  				      u64 file_offset)  { +	struct perf_evsel *evsel; +  	dump_event(session, event, file_offset, sample);  	switch (event->header.type) {  	case PERF_RECORD_SAMPLE:  		dump_sample(session, event, sample); -		return ops->sample(event, sample, session); +		evsel = perf_evlist__id2evsel(session->evlist, sample->id); +		if (evsel == NULL) { +			++session->hists.stats.nr_unknown_id; +			return -1; +		} +		return ops->sample(event, sample, evsel, session);  	case PERF_RECORD_MMAP:  		return ops->mmap(event, sample, session);  	case PERF_RECORD_COMM: @@ -845,6 +861,11 @@ static void perf_session__warn_about_errors(const struct perf_session *session,  			    session->hists.stats.nr_unknown_events);  	} +	if (session->hists.stats.nr_unknown_id != 0) { +		ui__warning("%u samples with id not present in the header\n", +			    session->hists.stats.nr_unknown_id); +	} +   	if (session->hists.stats.nr_invalid_chains != 0) {   		ui__warning("Found invalid callchains!\n\n"   			    "%u out of %u events were discarded for this reason.\n\n" diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 0b3c9afecaa9..1ac481fc1100 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -55,8 +55,11 @@ struct perf_session {  	char			filename[0];  }; +struct perf_evsel;  struct perf_event_ops; +typedef int (*event_sample)(union perf_event *event, struct perf_sample *sample, +			    struct perf_evsel *evsel, struct perf_session *session);  typedef int (*event_op)(union perf_event *self, struct perf_sample *sample,  			struct perf_session *session);  typedef int (*event_synth_op)(union perf_event *self, @@ -65,8 +68,8 @@ typedef int (*event_op2)(union perf_event *self, struct perf_session *session,  			 struct perf_event_ops *ops);  struct perf_event_ops { -	event_op	sample, -			mmap, +	event_sample	sample; +	event_op	mmap,  			comm,  			fork,  			exit, diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c index 66f4b78737ab..c9dcbec7d800 100644 --- a/tools/perf/util/trace-event-scripting.c +++ b/tools/perf/util/trace-event-scripting.c @@ -38,6 +38,7 @@ static int stop_script_unsupported(void)  static void process_event_unsupported(union perf_event *event __unused,  				      struct perf_sample *sample __unused, +				      struct perf_evsel *evsel __unused,  				      struct perf_session *session __unused,  				      struct thread *thread __unused)  { diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index b04da5722437..f674dda3363b 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h @@ -280,6 +280,7 @@ struct scripting_ops {  	int (*stop_script) (void);  	void (*process_event) (union perf_event *event,  			       struct perf_sample *sample, +			       struct perf_evsel *evsel,  			       struct perf_session *session,  			       struct thread *thread);  	int (*generate_script) (const char *outfile);  | 

