diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-12-27 18:37:02 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-28 03:03:34 -0500 |
commit | d549c7690190d9739005e19604faad6da4b802ac (patch) | |
tree | 1a03376ecc41ecd9495298ed3ad34f72da7ecea0 /tools/perf | |
parent | 27295592c22e71bbd38110c302da8dbb43912a60 (diff) |
perf session: Remove sample_type_check from event_ops
This is really something tools need to do before asking for the
events to be processed, leaving perf_session__process_events to
do just that, process events.
Also add a msg parameter to perf_session__has_traces() so that
the right message can be printed, fixing a regression added by
me in the previous cset (right timechart message) and also
fixing 'perf kmem', that was not asking if 'perf kmem record'
was ran.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1261957026-15580-6-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-kmem.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 16 | ||||
-rw-r--r-- | tools/perf/builtin-sched.c | 7 | ||||
-rw-r--r-- | tools/perf/builtin-timechart.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 4 | ||||
-rw-r--r-- | tools/perf/util/session.c | 16 | ||||
-rw-r--r-- | tools/perf/util/session.h | 3 |
7 files changed, 31 insertions, 27 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index a85936f09f3e..73b065022e27 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -345,7 +345,6 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
345 | static struct perf_event_ops event_ops = { | 345 | static struct perf_event_ops event_ops = { |
346 | .process_sample_event = process_sample_event, | 346 | .process_sample_event = process_sample_event, |
347 | .process_comm_event = event__process_comm, | 347 | .process_comm_event = event__process_comm, |
348 | .sample_type_check = perf_session__has_traces, | ||
349 | }; | 348 | }; |
350 | 349 | ||
351 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) | 350 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) |
@@ -492,11 +491,14 @@ static void sort_result(void) | |||
492 | 491 | ||
493 | static int __cmd_kmem(void) | 492 | static int __cmd_kmem(void) |
494 | { | 493 | { |
495 | int err; | 494 | int err = -EINVAL; |
496 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); | 495 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); |
497 | if (session == NULL) | 496 | if (session == NULL) |
498 | return -ENOMEM; | 497 | return -ENOMEM; |
499 | 498 | ||
499 | if (!perf_session__has_traces(session, "kmem record")) | ||
500 | goto out_delete; | ||
501 | |||
500 | setup_pager(); | 502 | setup_pager(); |
501 | err = perf_session__process_events(session, &event_ops); | 503 | err = perf_session__process_events(session, &event_ops); |
502 | if (err != 0) | 504 | if (err != 0) |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index db10c0e8ecae..08259184cedb 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -156,14 +156,14 @@ static int process_read_event(event_t *event, struct perf_session *session __use | |||
156 | return 0; | 156 | return 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | static int sample_type_check(struct perf_session *session) | 159 | static int perf_session__setup_sample_type(struct perf_session *self) |
160 | { | 160 | { |
161 | if (!(session->sample_type & PERF_SAMPLE_CALLCHAIN)) { | 161 | if (!(self->sample_type & PERF_SAMPLE_CALLCHAIN)) { |
162 | if (sort__has_parent) { | 162 | if (sort__has_parent) { |
163 | fprintf(stderr, "selected --sort parent, but no" | 163 | fprintf(stderr, "selected --sort parent, but no" |
164 | " callchain data. Did you call" | 164 | " callchain data. Did you call" |
165 | " perf record without -g?\n"); | 165 | " perf record without -g?\n"); |
166 | return -1; | 166 | return -EINVAL; |
167 | } | 167 | } |
168 | if (symbol_conf.use_callchain) { | 168 | if (symbol_conf.use_callchain) { |
169 | fprintf(stderr, "selected -g but no callchain data." | 169 | fprintf(stderr, "selected -g but no callchain data." |
@@ -176,7 +176,7 @@ static int sample_type_check(struct perf_session *session) | |||
176 | if (register_callchain_param(&callchain_param) < 0) { | 176 | if (register_callchain_param(&callchain_param) < 0) { |
177 | fprintf(stderr, "Can't register callchain" | 177 | fprintf(stderr, "Can't register callchain" |
178 | " params\n"); | 178 | " params\n"); |
179 | return -1; | 179 | return -EINVAL; |
180 | } | 180 | } |
181 | } | 181 | } |
182 | 182 | ||
@@ -191,13 +191,11 @@ static struct perf_event_ops event_ops = { | |||
191 | .process_fork_event = event__process_task, | 191 | .process_fork_event = event__process_task, |
192 | .process_lost_event = event__process_lost, | 192 | .process_lost_event = event__process_lost, |
193 | .process_read_event = process_read_event, | 193 | .process_read_event = process_read_event, |
194 | .sample_type_check = sample_type_check, | ||
195 | }; | 194 | }; |
196 | 195 | ||
197 | |||
198 | static int __cmd_report(void) | 196 | static int __cmd_report(void) |
199 | { | 197 | { |
200 | int ret; | 198 | int ret = -EINVAL; |
201 | struct perf_session *session; | 199 | struct perf_session *session; |
202 | 200 | ||
203 | session = perf_session__new(input_name, O_RDONLY, force); | 201 | session = perf_session__new(input_name, O_RDONLY, force); |
@@ -207,6 +205,10 @@ static int __cmd_report(void) | |||
207 | if (show_threads) | 205 | if (show_threads) |
208 | perf_read_values_init(&show_threads_values); | 206 | perf_read_values_init(&show_threads_values); |
209 | 207 | ||
208 | ret = perf_session__setup_sample_type(session); | ||
209 | if (ret) | ||
210 | goto out_delete; | ||
211 | |||
210 | ret = perf_session__process_events(session, &event_ops); | 212 | ret = perf_session__process_events(session, &event_ops); |
211 | if (ret) | 213 | if (ret) |
212 | goto out_delete; | 214 | goto out_delete; |
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index d65098c42990..e862e71f4e68 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -1657,17 +1657,18 @@ static struct perf_event_ops event_ops = { | |||
1657 | .process_sample_event = process_sample_event, | 1657 | .process_sample_event = process_sample_event, |
1658 | .process_comm_event = event__process_comm, | 1658 | .process_comm_event = event__process_comm, |
1659 | .process_lost_event = process_lost_event, | 1659 | .process_lost_event = process_lost_event, |
1660 | .sample_type_check = perf_session__has_traces, | ||
1661 | }; | 1660 | }; |
1662 | 1661 | ||
1663 | static int read_events(void) | 1662 | static int read_events(void) |
1664 | { | 1663 | { |
1665 | int err; | 1664 | int err = -EINVAL; |
1666 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); | 1665 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); |
1667 | if (session == NULL) | 1666 | if (session == NULL) |
1668 | return -ENOMEM; | 1667 | return -ENOMEM; |
1669 | 1668 | ||
1670 | err = perf_session__process_events(session, &event_ops); | 1669 | if (perf_session__has_traces(session, "record -R")) |
1670 | err = perf_session__process_events(session, &event_ops); | ||
1671 | |||
1671 | perf_session__delete(session); | 1672 | perf_session__delete(session); |
1672 | return err; | 1673 | return err; |
1673 | } | 1674 | } |
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index b42f337c17d9..825283794985 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -1034,17 +1034,19 @@ static struct perf_event_ops event_ops = { | |||
1034 | .process_fork_event = process_fork_event, | 1034 | .process_fork_event = process_fork_event, |
1035 | .process_exit_event = process_exit_event, | 1035 | .process_exit_event = process_exit_event, |
1036 | .process_sample_event = queue_sample_event, | 1036 | .process_sample_event = queue_sample_event, |
1037 | .sample_type_check = perf_session__has_traces, | ||
1038 | }; | 1037 | }; |
1039 | 1038 | ||
1040 | static int __cmd_timechart(void) | 1039 | static int __cmd_timechart(void) |
1041 | { | 1040 | { |
1042 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); | 1041 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); |
1043 | int ret; | 1042 | int ret = -EINVAL; |
1044 | 1043 | ||
1045 | if (session == NULL) | 1044 | if (session == NULL) |
1046 | return -ENOMEM; | 1045 | return -ENOMEM; |
1047 | 1046 | ||
1047 | if (!perf_session__has_traces(session, "timechart record")) | ||
1048 | goto out_delete; | ||
1049 | |||
1048 | ret = perf_session__process_events(session, &event_ops); | 1050 | ret = perf_session__process_events(session, &event_ops); |
1049 | if (ret) | 1051 | if (ret) |
1050 | goto out_delete; | 1052 | goto out_delete; |
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index b0ba2ac37e2c..e94f34631585 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -106,7 +106,6 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
106 | static struct perf_event_ops event_ops = { | 106 | static struct perf_event_ops event_ops = { |
107 | .process_sample_event = process_sample_event, | 107 | .process_sample_event = process_sample_event, |
108 | .process_comm_event = event__process_comm, | 108 | .process_comm_event = event__process_comm, |
109 | .sample_type_check = perf_session__has_traces, | ||
110 | }; | 109 | }; |
111 | 110 | ||
112 | static int __cmd_trace(struct perf_session *session) | 111 | static int __cmd_trace(struct perf_session *session) |
@@ -580,6 +579,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
580 | if (session == NULL) | 579 | if (session == NULL) |
581 | return -ENOMEM; | 580 | return -ENOMEM; |
582 | 581 | ||
582 | if (!perf_session__has_traces(session, "record -R")) | ||
583 | return -EINVAL; | ||
584 | |||
583 | if (generate_script_lang) { | 585 | if (generate_script_lang) { |
584 | struct stat perf_stat; | 586 | struct stat perf_stat; |
585 | 587 | ||
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 60eab8b3ff34..bc84a5217955 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -73,6 +73,8 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc | |||
73 | 73 | ||
74 | if (mode == O_RDONLY && perf_session__open(self, force) < 0) | 74 | if (mode == O_RDONLY && perf_session__open(self, force) < 0) |
75 | goto out_delete; | 75 | goto out_delete; |
76 | |||
77 | self->sample_type = perf_header__sample_type(&self->header); | ||
76 | out: | 78 | out: |
77 | return self; | 79 | return self; |
78 | out_free: | 80 | out_free: |
@@ -302,11 +304,6 @@ int perf_session__process_events(struct perf_session *self, | |||
302 | page_size = getpagesize(); | 304 | page_size = getpagesize(); |
303 | 305 | ||
304 | head = self->header.data_offset; | 306 | head = self->header.data_offset; |
305 | self->sample_type = perf_header__sample_type(&self->header); | ||
306 | |||
307 | err = -EINVAL; | ||
308 | if (ops->sample_type_check && ops->sample_type_check(self) < 0) | ||
309 | goto out_err; | ||
310 | 307 | ||
311 | if (!ops->full_paths) { | 308 | if (!ops->full_paths) { |
312 | char bf[PATH_MAX]; | 309 | char bf[PATH_MAX]; |
@@ -394,13 +391,12 @@ out_err: | |||
394 | return err; | 391 | return err; |
395 | } | 392 | } |
396 | 393 | ||
397 | int perf_session__has_traces(struct perf_session *self) | 394 | bool perf_session__has_traces(struct perf_session *self, const char *msg) |
398 | { | 395 | { |
399 | if (!(self->sample_type & PERF_SAMPLE_RAW)) { | 396 | if (!(self->sample_type & PERF_SAMPLE_RAW)) { |
400 | pr_err("No trace sample to read. Did you call perf record " | 397 | pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg); |
401 | "without -R?"); | 398 | return false; |
402 | return -1; | ||
403 | } | 399 | } |
404 | 400 | ||
405 | return 0; | 401 | return true; |
406 | } | 402 | } |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index a6951d2f700f..5771ccb3fe03 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -40,7 +40,6 @@ struct perf_event_ops { | |||
40 | event_op process_read_event; | 40 | event_op process_read_event; |
41 | event_op process_throttle_event; | 41 | event_op process_throttle_event; |
42 | event_op process_unthrottle_event; | 42 | event_op process_unthrottle_event; |
43 | int (*sample_type_check)(struct perf_session *session); | ||
44 | unsigned long total_unknown; | 43 | unsigned long total_unknown; |
45 | bool full_paths; | 44 | bool full_paths; |
46 | }; | 45 | }; |
@@ -56,7 +55,7 @@ struct symbol **perf_session__resolve_callchain(struct perf_session *self, | |||
56 | struct ip_callchain *chain, | 55 | struct ip_callchain *chain, |
57 | struct symbol **parent); | 56 | struct symbol **parent); |
58 | 57 | ||
59 | int perf_session__has_traces(struct perf_session *self); | 58 | bool perf_session__has_traces(struct perf_session *self, const char *msg); |
60 | 59 | ||
61 | int perf_header__read_build_ids(int input, u64 offset, u64 file_size); | 60 | int perf_header__read_build_ids(int input, u64 offset, u64 file_size); |
62 | 61 | ||