perf session: Remove sample_type_check from event_ops
authorArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 27 Dec 2009 23:37:02 +0000 (21:37 -0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 28 Dec 2009 08:03:34 +0000 (09:03 +0100)
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>
tools/perf/builtin-kmem.c
tools/perf/builtin-report.c
tools/perf/builtin-sched.c
tools/perf/builtin-timechart.c
tools/perf/builtin-trace.c
tools/perf/util/session.c
tools/perf/util/session.h

index a85936f..73b0650 100644 (file)
@@ -345,7 +345,6 @@ static int process_sample_event(event_t *event, struct perf_session *session)
 static struct perf_event_ops event_ops = {
        .process_sample_event   = process_sample_event,
        .process_comm_event     = event__process_comm,
-       .sample_type_check      = perf_session__has_traces,
 };
 
 static double fragmentation(unsigned long n_req, unsigned long n_alloc)
@@ -492,11 +491,14 @@ static void sort_result(void)
 
 static int __cmd_kmem(void)
 {
-       int err;
+       int err = -EINVAL;
        struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0);
        if (session == NULL)
                return -ENOMEM;
 
+       if (!perf_session__has_traces(session, "kmem record"))
+               goto out_delete;
+
        setup_pager();
        err = perf_session__process_events(session, &event_ops);
        if (err != 0)
index db10c0e..0825918 100644 (file)
@@ -156,14 +156,14 @@ static int process_read_event(event_t *event, struct perf_session *session __use
        return 0;
 }
 
-static int sample_type_check(struct perf_session *session)
+static int perf_session__setup_sample_type(struct perf_session *self)
 {
-       if (!(session->sample_type & PERF_SAMPLE_CALLCHAIN)) {
+       if (!(self->sample_type & PERF_SAMPLE_CALLCHAIN)) {
                if (sort__has_parent) {
                        fprintf(stderr, "selected --sort parent, but no"
                                        " callchain data. Did you call"
                                        " perf record without -g?\n");
-                       return -1;
+                       return -EINVAL;
                }
                if (symbol_conf.use_callchain) {
                        fprintf(stderr, "selected -g but no callchain data."
@@ -176,7 +176,7 @@ static int sample_type_check(struct perf_session *session)
                        if (register_callchain_param(&callchain_param) < 0) {
                                fprintf(stderr, "Can't register callchain"
                                                " params\n");
-                               return -1;
+                               return -EINVAL;
                        }
        }
 
@@ -191,13 +191,11 @@ static struct perf_event_ops event_ops = {
        .process_fork_event     = event__process_task,
        .process_lost_event     = event__process_lost,
        .process_read_event     = process_read_event,
-       .sample_type_check      = sample_type_check,
 };
 
-
 static int __cmd_report(void)
 {
-       int ret;
+       int ret = -EINVAL;
        struct perf_session *session;
 
        session = perf_session__new(input_name, O_RDONLY, force);
@@ -207,6 +205,10 @@ static int __cmd_report(void)
        if (show_threads)
                perf_read_values_init(&show_threads_values);
 
+       ret = perf_session__setup_sample_type(session);
+       if (ret)
+               goto out_delete;
+
        ret = perf_session__process_events(session, &event_ops);
        if (ret)
                goto out_delete;
index d65098c..e862e71 100644 (file)
@@ -1657,17 +1657,18 @@ static struct perf_event_ops event_ops = {
        .process_sample_event   = process_sample_event,
        .process_comm_event     = event__process_comm,
        .process_lost_event     = process_lost_event,
-       .sample_type_check      = perf_session__has_traces,
 };
 
 static int read_events(void)
 {
-       int err;
+       int err = -EINVAL;
        struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0);
        if (session == NULL)
                return -ENOMEM;
 
-       err = perf_session__process_events(session, &event_ops);
+       if (perf_session__has_traces(session, "record -R"))
+               err = perf_session__process_events(session, &event_ops);
+
        perf_session__delete(session);
        return err;
 }
index b42f337..8252837 100644 (file)
@@ -1034,17 +1034,19 @@ static struct perf_event_ops event_ops = {
        .process_fork_event     = process_fork_event,
        .process_exit_event     = process_exit_event,
        .process_sample_event   = queue_sample_event,
-       .sample_type_check      = perf_session__has_traces,
 };
 
 static int __cmd_timechart(void)
 {
        struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0);
-       int ret;
+       int ret = -EINVAL;
 
        if (session == NULL)
                return -ENOMEM;
 
+       if (!perf_session__has_traces(session, "timechart record"))
+               goto out_delete;
+
        ret = perf_session__process_events(session, &event_ops);
        if (ret)
                goto out_delete;
index b0ba2ac..e94f346 100644 (file)
@@ -106,7 +106,6 @@ static int process_sample_event(event_t *event, struct perf_session *session)
 static struct perf_event_ops event_ops = {
        .process_sample_event   = process_sample_event,
        .process_comm_event     = event__process_comm,
-       .sample_type_check      = perf_session__has_traces,
 };
 
 static int __cmd_trace(struct perf_session *session)
@@ -580,6 +579,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
        if (session == NULL)
                return -ENOMEM;
 
+       if (!perf_session__has_traces(session, "record -R"))
+               return -EINVAL;
+
        if (generate_script_lang) {
                struct stat perf_stat;
 
index 60eab8b..bc84a52 100644 (file)
@@ -73,6 +73,8 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc
 
        if (mode == O_RDONLY && perf_session__open(self, force) < 0)
                goto out_delete;
+
+       self->sample_type = perf_header__sample_type(&self->header);
 out:
        return self;
 out_free:
@@ -302,11 +304,6 @@ int perf_session__process_events(struct perf_session *self,
        page_size = getpagesize();
 
        head = self->header.data_offset;
-       self->sample_type = perf_header__sample_type(&self->header);
-
-       err = -EINVAL;
-       if (ops->sample_type_check && ops->sample_type_check(self) < 0)
-               goto out_err;
 
        if (!ops->full_paths) {
                char bf[PATH_MAX];
@@ -394,13 +391,12 @@ out_err:
        return err;
 }
 
-int perf_session__has_traces(struct perf_session *self)
+bool perf_session__has_traces(struct perf_session *self, const char *msg)
 {
        if (!(self->sample_type & PERF_SAMPLE_RAW)) {
-               pr_err("No trace sample to read. Did you call perf record "
-                      "without -R?");
-               return -1;
+               pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg);
+               return false;
        }
 
-       return 0;
+       return true;
 }
index a6951d2..5771ccb 100644 (file)
@@ -40,7 +40,6 @@ struct perf_event_ops {
        event_op        process_read_event;
        event_op        process_throttle_event;
        event_op        process_unthrottle_event;
-       int             (*sample_type_check)(struct perf_session *session);
        unsigned long   total_unknown;
        bool            full_paths;
 };
@@ -56,7 +55,7 @@ struct symbol **perf_session__resolve_callchain(struct perf_session *self,
                                                struct ip_callchain *chain,
                                                struct symbol **parent);
 
-int perf_session__has_traces(struct perf_session *self);
+bool perf_session__has_traces(struct perf_session *self, const char *msg);
 
 int perf_header__read_build_ids(int input, u64 offset, u64 file_size);