perf annotate: Move session handling out of __cmd_annotate()
authorNamhyung Kim <namhyung@kernel.org>
Tue, 12 Aug 2014 06:40:35 +0000 (15:40 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 13 Aug 2014 19:31:23 +0000 (16:31 -0300)
This is a preparation of fixing dso__load_kernel_sym().  It needs a
session info before calling symbol__init().

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1407825645-24586-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-annotate.c

index 952b5ece6740c3abde175b473c2a706f9fce448a..c0464dc380576625ee50cf5c98bd82cfc8c790c7 100644 (file)
@@ -36,7 +36,8 @@
 
 struct perf_annotate {
        struct perf_tool tool;
-       bool       force, use_tui, use_stdio, use_gtk;
+       struct perf_session *session;
+       bool       use_tui, use_stdio, use_gtk;
        bool       full_paths;
        bool       print_line;
        bool       skip_missing;
@@ -188,18 +189,9 @@ find_next:
 static int __cmd_annotate(struct perf_annotate *ann)
 {
        int ret;
-       struct perf_session *session;
+       struct perf_session *session = ann->session;
        struct perf_evsel *pos;
        u64 total_nr_samples;
-       struct perf_data_file file = {
-               .path  = input_name,
-               .mode  = PERF_DATA_MODE_READ,
-               .force = ann->force,
-       };
-
-       session = perf_session__new(&file, false, &ann->tool);
-       if (session == NULL)
-               return -ENOMEM;
 
        machines__set_symbol_filter(&session->machines, symbol__annotate_init);
 
@@ -207,22 +199,22 @@ static int __cmd_annotate(struct perf_annotate *ann)
                ret = perf_session__cpu_bitmap(session, ann->cpu_list,
                                               ann->cpu_bitmap);
                if (ret)
-                       goto out_delete;
+                       goto out;
        }
 
        if (!objdump_path) {
                ret = perf_session_env__lookup_objdump(&session->header.env);
                if (ret)
-                       goto out_delete;
+                       goto out;
        }
 
        ret = perf_session__process_events(session, &ann->tool);
        if (ret)
-               goto out_delete;
+               goto out;
 
        if (dump_trace) {
                perf_session__fprintf_nr_events(session, stdout);
-               goto out_delete;
+               goto out;
        }
 
        if (verbose > 3)
@@ -250,8 +242,8 @@ static int __cmd_annotate(struct perf_annotate *ann)
        }
 
        if (total_nr_samples == 0) {
-               ui__error("The %s file has no samples!\n", file.path);
-               goto out_delete;
+               ui__error("The %s file has no samples!\n", session->file->path);
+               goto out;
        }
 
        if (use_browser == 2) {
@@ -261,24 +253,12 @@ static int __cmd_annotate(struct perf_annotate *ann)
                                         "perf_gtk__show_annotations");
                if (show_annotations == NULL) {
                        ui__error("GTK browser not found!\n");
-                       goto out_delete;
+                       goto out;
                }
                show_annotations();
        }
 
-out_delete:
-       /*
-        * Speed up the exit process, for large files this can
-        * take quite a while.
-        *
-        * XXX Enable this when using valgrind or if we ever
-        * librarize this command.
-        *
-        * Also experiment with obstacks to see how much speed
-        * up we'll get here.
-        *
-        * perf_session__delete(session);
-        */
+out:
        return ret;
 }
 
@@ -301,6 +281,10 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
                        .ordering_requires_timestamps = true,
                },
        };
+       struct perf_data_file file = {
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+       };
        const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
@@ -308,7 +292,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
                   "only consider symbols in these dsos"),
        OPT_STRING('s', "symbol", &annotate.sym_hist_filter, "symbol",
                    "symbol to annotate"),
-       OPT_BOOLEAN('f', "force", &annotate.force, "don't complain, do it"),
+       OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"),
        OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
@@ -341,6 +325,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
                    "Show event group information together"),
        OPT_END()
        };
+       int ret;
 
        argc = parse_options(argc, argv, options, annotate_usage, 0);
 
@@ -353,11 +338,16 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
 
        setup_browser(true);
 
+       annotate.session = perf_session__new(&file, false, &annotate.tool);
+       if (annotate.session == NULL)
+               return -ENOMEM;
+
        symbol_conf.priv_size = sizeof(struct annotation);
        symbol_conf.try_vmlinux_path = true;
 
-       if (symbol__init() < 0)
-               return -1;
+       ret = symbol__init();
+       if (ret < 0)
+               goto out_delete;
 
        if (setup_sorting() < 0)
                usage_with_options(annotate_usage, options);
@@ -373,5 +363,20 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
                annotate.sym_hist_filter = argv[0];
        }
 
-       return __cmd_annotate(&annotate);
+       ret = __cmd_annotate(&annotate);
+
+out_delete:
+       /*
+        * Speed up the exit process, for large files this can
+        * take quite a while.
+        *
+        * XXX Enable this when using valgrind or if we ever
+        * librarize this command.
+        *
+        * Also experiment with obstacks to see how much speed
+        * up we'll get here.
+        *
+        * perf_session__delete(session);
+        */
+       return ret;
 }