perf data: Add global path holder
authorJiri Olsa <jolsa@kernel.org>
Thu, 21 Feb 2019 09:41:30 +0000 (10:41 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 22 Feb 2019 19:52:07 +0000 (16:52 -0300)
Add a 'path' member to 'struct perf_data'. It will keep the configured
path for the data (const char *). The path in struct perf_data_file is
now dynamically allocated (duped) from it.

This scheme is useful/used in following patches where struct
perf_data::path holds the 'configure' directory path and struct
perf_data_file::path holds the allocated path for specific files.

Also it actually makes the code little simpler.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20190221094145.9151-3-jolsa@kernel.org
[ Fixup data-convert-bt.c missing conversion ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
21 files changed:
tools/perf/builtin-annotate.c
tools/perf/builtin-buildid-cache.c
tools/perf/builtin-buildid-list.c
tools/perf/builtin-c2c.c
tools/perf/builtin-diff.c
tools/perf/builtin-evlist.c
tools/perf/builtin-inject.c
tools/perf/builtin-kmem.c
tools/perf/builtin-kvm.c
tools/perf/builtin-lock.c
tools/perf/builtin-mem.c
tools/perf/builtin-record.c
tools/perf/builtin-report.c
tools/perf/builtin-sched.c
tools/perf/builtin-script.c
tools/perf/builtin-stat.c
tools/perf/builtin-timechart.c
tools/perf/builtin-trace.c
tools/perf/util/data-convert-bt.c
tools/perf/util/data.c
tools/perf/util/data.h

index 7f3c3fea67b48b4fa2819b4b439571568038f1d5..67f9d9ffacfbb9cdfe9e56496a7c1c264b700c5f 100644 (file)
@@ -441,7 +441,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
        }
 
        if (total_nr_samples == 0) {
-               ui__error("The %s file has no samples!\n", session->data->file.path);
+               ui__error("The %s data has no samples!\n", session->data->path);
                goto out;
        }
 
@@ -578,7 +578,7 @@ int cmd_annotate(int argc, const char **argv)
        if (quiet)
                perf_quiet_option();
 
-       data.file.path = input_name;
+       data.path = input_name;
 
        annotate.session = perf_session__new(&data, false, &annotate.tool);
        if (annotate.session == NULL)
index 115110a4796a1aa60ab8730066aad7df7522fd3a..10457b10e568492813c1b5ccbf832e28f9535dba 100644 (file)
@@ -416,8 +416,8 @@ int cmd_buildid_cache(int argc, const char **argv)
                nsi = nsinfo__new(ns_id);
 
        if (missing_filename) {
-               data.file.path = missing_filename;
-               data.force     = force;
+               data.path  = missing_filename;
+               data.force = force;
 
                session = perf_session__new(&data, false, NULL);
                if (session == NULL)
index 78abbe8d9d5ff0a8c2c396619d1566f2c00def44..f403e19488b5e4c6607ad1c9a5ccd5bfe968bd78 100644 (file)
@@ -52,11 +52,9 @@ static int perf_session__list_build_ids(bool force, bool with_hits)
 {
        struct perf_session *session;
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = force,
        };
 
        symbol__elf_init();
index efaaab23c6fd7a84bc5eec36c4a627422806cedc..4272763a5e968fe00ff4024ee4504aa8749e8a7f 100644 (file)
@@ -2750,8 +2750,8 @@ static int perf_c2c__report(int argc, const char **argv)
        if (!input_name || !strlen(input_name))
                input_name = "perf.data";
 
-       data.file.path = input_name;
-       data.force     = symbol_conf.force;
+       data.path  = input_name;
+       data.force = symbol_conf.force;
 
        err = setup_display(display);
        if (err)
index 751e1971456baa7c4660ed3d34a4b039a7c708b7..58fe0e88215c058b920299d552881c54c878f89e 100644 (file)
@@ -708,7 +708,7 @@ static void data__fprintf(void)
 
        data__for_each_file(i, d)
                fprintf(stdout, "#  [%d] %s %s\n",
-                       d->idx, d->data.file.path,
+                       d->idx, d->data.path,
                        !d->idx ? "(Baseline)" : "");
 
        fprintf(stdout, "#\n");
@@ -779,14 +779,14 @@ static int __cmd_diff(void)
        data__for_each_file(i, d) {
                d->session = perf_session__new(&d->data, false, &tool);
                if (!d->session) {
-                       pr_err("Failed to open %s\n", d->data.file.path);
+                       pr_err("Failed to open %s\n", d->data.path);
                        ret = -1;
                        goto out_delete;
                }
 
                ret = perf_session__process_events(d->session);
                if (ret) {
-                       pr_err("Failed to process %s\n", d->data.file.path);
+                       pr_err("Failed to process %s\n", d->data.path);
                        goto out_delete;
                }
 
@@ -1289,9 +1289,9 @@ static int data_init(int argc, const char **argv)
        data__for_each_file(i, d) {
                struct perf_data *data = &d->data;
 
-               data->file.path = use_default ? defaults[i] : argv[i];
-               data->mode      = PERF_DATA_MODE_READ,
-               data->force     = force,
+               data->path  = use_default ? defaults[i] : argv[i];
+               data->mode  = PERF_DATA_MODE_READ,
+               data->force = force,
 
                d->idx  = i;
        }
index e06e822ce6348768ee12ac45d70f39c9d9827a90..6e4f63b0da4a124f3914184a83d724ccedc70bb7 100644 (file)
@@ -23,9 +23,7 @@ static int __cmd_evlist(const char *file_name, struct perf_attr_details *details
        struct perf_session *session;
        struct perf_evsel *pos;
        struct perf_data data = {
-               .file      = {
-                       .path = file_name,
-               },
+               .path      = file_name,
                .mode      = PERF_DATA_MODE_READ,
                .force     = details->force,
        };
index 9bb1f35d5cb7ffe4f17af6ca00a28c280a49f8ce..24086b7f1b14a2932867564612447683fc1a6de1 100644 (file)
@@ -770,10 +770,8 @@ int cmd_inject(int argc, const char **argv)
                .input_name  = "-",
                .samples = LIST_HEAD_INIT(inject.samples),
                .output = {
-                       .file      = {
-                               .path = "-",
-                       },
-                       .mode      = PERF_DATA_MODE_WRITE,
+                       .path = "-",
+                       .mode = PERF_DATA_MODE_WRITE,
                },
        };
        struct perf_data data = {
@@ -786,7 +784,7 @@ int cmd_inject(int argc, const char **argv)
                            "Inject build-ids into the output stream"),
                OPT_STRING('i', "input", &inject.input_name, "file",
                           "input file name"),
-               OPT_STRING('o', "output", &inject.output.file.path, "file",
+               OPT_STRING('o', "output", &inject.output.path, "file",
                           "output file name"),
                OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
                            "Merge sched-stat and sched-switch for getting events "
@@ -834,7 +832,7 @@ int cmd_inject(int argc, const char **argv)
 
        inject.tool.ordered_events = inject.sched_stat;
 
-       data.file.path = inject.input_name;
+       data.path = inject.input_name;
        inject.session = perf_session__new(&data, true, &inject.tool);
        if (inject.session == NULL)
                return -1;
index b80ec0883537a5436773692bf99ea8067425c299..fa520f4b8095ae6eac3922ac73781605041772be 100644 (file)
@@ -1949,7 +1949,7 @@ int cmd_kmem(int argc, const char **argv)
                return __cmd_record(argc, argv);
        }
 
-       data.file.path = input_name;
+       data.path = input_name;
 
        kmem_session = session = perf_session__new(&data, false, &perf_kmem);
        if (session == NULL)
index 3d4cbc4e87c78a187d1b86c530f9783da136c7ce..dbb6f737a3e237485cb0f47d0aa83b655c25b119 100644 (file)
@@ -1080,11 +1080,9 @@ static int read_events(struct perf_kvm_stat *kvm)
                .ordered_events         = true,
        };
        struct perf_data file = {
-               .file      = {
-                       .path = kvm->file_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = kvm->force,
+               .path  = kvm->file_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = kvm->force,
        };
 
        kvm->tool = eops;
index 6e0189df2b3baf96a34ac3053098bc9b331d9a7e..b9810a8d350ab166d84ad14995bb1b4cfa05ecc2 100644 (file)
@@ -866,11 +866,9 @@ static int __cmd_report(bool display_info)
                .ordered_events  = true,
        };
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = force,
        };
 
        session = perf_session__new(&data, false, &eops);
index ba7e8d87dec33cf20e5fccc7a7ba93926273a73e..f45c8b502f63f2d9207671710ab99a13f1c2e7ae 100644 (file)
@@ -239,11 +239,9 @@ static int process_sample_event(struct perf_tool *tool,
 static int report_raw_events(struct perf_mem *mem)
 {
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = mem->force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = mem->force,
        };
        int ret;
        struct perf_session *session = perf_session__new(&data, false,
index e5e9900c9039c3599a055fbc18c6987a0fd0e7c0..f3f7f310033663f5b61752cfb6c835b280f8436e 100644 (file)
@@ -918,7 +918,7 @@ record__switch_output(struct record *rec, bool at_exit)
 
        if (!quiet)
                fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
-                       data->file.path, timestamp);
+                       data->path, timestamp);
 
        /* Output tracking events */
        if (!at_exit) {
@@ -1461,7 +1461,7 @@ out_child:
 
                fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
                        perf_data__size(data) / 1024.0 / 1024.0,
-                       data->file.path, postfix, samples);
+                       data->path, postfix, samples);
        }
 
 out_delete_session:
@@ -1862,7 +1862,7 @@ static struct option __record_options[] = {
        OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
                    "list of cpus to monitor"),
        OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
-       OPT_STRING('o', "output", &record.data.file.path, "file",
+       OPT_STRING('o', "output", &record.data.path, "file",
                    "output file name"),
        OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
                        &record.opts.no_inherit_set,
index 2e8c74d6430cf7147c41470414f76ad78ebe5ea4..1532ebde6c4b82958c30fd33313a4b5deca077c0 100644 (file)
@@ -899,7 +899,7 @@ static int __cmd_report(struct report *rep)
                rep->nr_entries += evsel__hists(pos)->nr_entries;
 
        if (rep->nr_entries == 0) {
-               ui__error("The %s file has no samples!\n", data->file.path);
+               ui__error("The %s data has no samples!\n", data->path);
                return 0;
        }
 
@@ -1207,8 +1207,8 @@ int cmd_report(int argc, const char **argv)
                        input_name = "perf.data";
        }
 
-       data.file.path = input_name;
-       data.force     = symbol_conf.force;
+       data.path  = input_name;
+       data.force = symbol_conf.force;
 
 repeat:
        session = perf_session__new(&data, false, &report.tool);
index 640558e9352e7b00eafab3e7cdaf732d57ad9e74..275f2d92a7bf97de9888838930d745f8f89dba6c 100644 (file)
@@ -1785,11 +1785,9 @@ static int perf_sched__read_events(struct perf_sched *sched)
        };
        struct perf_session *session;
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = sched->force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = sched->force,
        };
        int rc = -1;
 
@@ -2958,11 +2956,9 @@ static int perf_sched__timehist(struct perf_sched *sched)
                { "sched:sched_migrate_task", timehist_migrate_task_event, },
        };
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = sched->force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = sched->force,
        };
 
        struct perf_session *session;
index 373ea151dc602147f58a9ed21b56f9267e0d7a9d..5b1543f422900fafcbbd3090a2497d1622c97f3b 100644 (file)
@@ -2951,10 +2951,8 @@ int find_scripts(char **scripts_array, char **scripts_path_array)
        DIR *scripts_dir, *lang_dir;
        struct perf_session *session;
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
+               .path = input_name,
+               .mode = PERF_DATA_MODE_READ,
        };
        char *temp;
        int i = 0;
@@ -3427,8 +3425,8 @@ int cmd_script(int argc, const char **argv)
        argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
 
-       data.file.path = input_name;
-       data.force     = symbol_conf.force;
+       data.path  = input_name;
+       data.force = symbol_conf.force;
 
        if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
                rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
@@ -3654,7 +3652,7 @@ int cmd_script(int argc, const char **argv)
                        goto out_delete;
                }
 
-               input = open(data.file.path, O_RDONLY); /* input_name */
+               input = open(data.path, O_RDONLY);      /* input_name */
                if (input < 0) {
                        err = -errno;
                        perror("failed to open file");
index bb24f9c17f9a62c8ded72479313177d67dba1bb2..7b8f09b0b8bf7139463fb8d8736346c73f3cfe65 100644 (file)
@@ -1322,7 +1322,7 @@ static int __cmd_record(int argc, const char **argv)
                             PARSE_OPT_STOP_AT_NON_OPTION);
 
        if (output_name)
-               data->file.path = output_name;
+               data->path = output_name;
 
        if (stat_config.run_count != 1 || forever) {
                pr_err("Cannot use -r option with perf stat record.\n");
@@ -1523,8 +1523,8 @@ static int __cmd_report(int argc, const char **argv)
                        input_name = "perf.data";
        }
 
-       perf_stat.data.file.path = input_name;
-       perf_stat.data.mode      = PERF_DATA_MODE_READ;
+       perf_stat.data.path = input_name;
+       perf_stat.data.mode = PERF_DATA_MODE_READ;
 
        session = perf_session__new(&perf_stat.data, false, &perf_stat.tool);
        if (session == NULL)
index 775b99833e513541bc7e64909b77e8fb448450b0..9b98687a27b9bd584244cf001a6c36542ffb98e5 100644 (file)
@@ -1602,11 +1602,9 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name)
                { "syscalls:sys_exit_select",           process_exit_poll },
        };
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = tchart->force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = tchart->force,
        };
 
        struct perf_session *session = perf_session__new(&data, false,
index 1a11fe656afcb69e99ae16609ecf0adccb57d6bc..f5b3a1e9c1ddfc446cb37dc7fb30d4959dfae648 100644 (file)
@@ -3154,11 +3154,9 @@ static int trace__replay(struct trace *trace)
                { "probe:vfs_getname",       trace__vfs_getname, },
        };
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
-               .force     = trace->force,
+               .path  = input_name,
+               .mode  = PERF_DATA_MODE_READ,
+               .force = trace->force,
        };
        struct perf_session *session;
        struct perf_evsel *evsel;
index 2a36fab7699400c58d181dffd22e19a8212573e4..26af43ad9ddd331bd74b62a09d2833821bfc3996 100644 (file)
@@ -1578,7 +1578,7 @@ int bt_convert__perf2ctf(const char *input, const char *path,
 {
        struct perf_session *session;
        struct perf_data data = {
-               .file      = { .path = input, .fd = -1 },
+               .path      = input,
                .mode      = PERF_DATA_MODE_READ,
                .force     = opts->force,
        };
@@ -1650,7 +1650,7 @@ int bt_convert__perf2ctf(const char *input, const char *path,
 
        fprintf(stderr,
                "[ perf data convert: Converted '%s' into CTF data '%s' ]\n",
-               data.file.path, path);
+               data.path, path);
 
        fprintf(stderr,
                "[ perf data convert: Converted and wrote %.3f MB (%" PRIu64 " samples",
index 09eceda17fc29f27c0c092dea11af979641b02d9..e16d06ed11000dd5b126069eeb4921caceb44974 100644 (file)
@@ -19,11 +19,11 @@ static bool check_pipe(struct perf_data *data)
        int fd = perf_data__is_read(data) ?
                 STDIN_FILENO : STDOUT_FILENO;
 
-       if (!data->file.path) {
+       if (!data->path) {
                if (!fstat(fd, &st) && S_ISFIFO(st.st_mode))
                        is_pipe = true;
        } else {
-               if (!strcmp(data->file.path, "-"))
+               if (!strcmp(data->path, "-"))
                        is_pipe = true;
        }
 
@@ -37,13 +37,13 @@ static int check_backup(struct perf_data *data)
 {
        struct stat st;
 
-       if (!stat(data->file.path, &st) && st.st_size) {
+       if (!stat(data->path, &st) && st.st_size) {
                /* TODO check errors properly */
                char oldname[PATH_MAX];
                snprintf(oldname, sizeof(oldname), "%s.old",
-                        data->file.path);
+                        data->path);
                unlink(oldname);
-               rename(data->file.path, oldname);
+               rename(data->path, oldname);
        }
 
        return 0;
@@ -115,8 +115,22 @@ static int open_file(struct perf_data *data)
        fd = perf_data__is_read(data) ?
             open_file_read(data) : open_file_write(data);
 
+       if (fd < 0) {
+               free(data->file.path);
+               return -1;
+       }
+
        data->file.fd = fd;
-       return fd < 0 ? -1 : 0;
+       return 0;
+}
+
+static int open_file_dup(struct perf_data *data)
+{
+       data->file.path = strdup(data->path);
+       if (!data->file.path)
+               return -ENOMEM;
+
+       return open_file(data);
 }
 
 int perf_data__open(struct perf_data *data)
@@ -124,14 +138,15 @@ int perf_data__open(struct perf_data *data)
        if (check_pipe(data))
                return 0;
 
-       if (!data->file.path)
-               data->file.path = "perf.data";
+       if (!data->path)
+               data->path = "perf.data";
 
-       return open_file(data);
+       return open_file_dup(data);
 }
 
 void perf_data__close(struct perf_data *data)
 {
+       free(data->file.path);
        close(data->file.fd);
 }
 
@@ -159,15 +174,15 @@ int perf_data__switch(struct perf_data *data,
        if (perf_data__is_read(data))
                return -EINVAL;
 
-       if (asprintf(&new_filepath, "%s.%s", data->file.path, postfix) < 0)
+       if (asprintf(&new_filepath, "%s.%s", data->path, postfix) < 0)
                return -ENOMEM;
 
        /*
         * Only fire a warning, don't return error, continue fill
         * original file.
         */
-       if (rename(data->file.path, new_filepath))
-               pr_warning("Failed to rename %s to %s\n", data->file.path, new_filepath);
+       if (rename(data->path, new_filepath))
+               pr_warning("Failed to rename %s to %s\n", data->path, new_filepath);
 
        if (!at_exit) {
                close(data->file.fd);
index 85f9c0dbf9826b5e9d1ad984bf5c73ecb13c3919..2bce28117ccfd9d8626b4bc0fbfbd139a4c7f15a 100644 (file)
@@ -10,12 +10,13 @@ enum perf_data_mode {
 };
 
 struct perf_data_file {
-       const char      *path;
+       char            *path;
        int              fd;
        unsigned long    size;
 };
 
 struct perf_data {
+       const char              *path;
        struct perf_data_file    file;
        bool                     is_pipe;
        bool                     force;