mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-25 08:02:56 +00:00
perf tools: Add struct perf_data_file
Add struct perf_data_file to represent a single file within a perf_data struct. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Andi Kleen <andi@firstfloor.org> Cc: Changbin Du <changbin.du@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jin Yao <yao.jin@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-c3f9p4xzykr845ktqcek6p4t@git.kernel.org [ Fixup recent changes in 'perf script --per-event-dump' ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
8ceb41d7e3
commit
eae8ad8042
23 changed files with 127 additions and 97 deletions
|
@ -356,7 +356,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (total_nr_samples == 0) {
|
if (total_nr_samples == 0) {
|
||||||
ui__error("The %s file has no samples!\n", session->data->path);
|
ui__error("The %s file has no samples!\n", session->data->file.path);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,7 +482,7 @@ int cmd_annotate(int argc, const char **argv)
|
||||||
if (quiet)
|
if (quiet)
|
||||||
perf_quiet_option();
|
perf_quiet_option();
|
||||||
|
|
||||||
data.path = input_name;
|
data.file.path = input_name;
|
||||||
|
|
||||||
annotate.session = perf_session__new(&data, false, &annotate.tool);
|
annotate.session = perf_session__new(&data, false, &annotate.tool);
|
||||||
if (annotate.session == NULL)
|
if (annotate.session == NULL)
|
||||||
|
|
|
@ -352,7 +352,7 @@ int cmd_buildid_cache(int argc, const char **argv)
|
||||||
nsi = nsinfo__new(ns_id);
|
nsi = nsinfo__new(ns_id);
|
||||||
|
|
||||||
if (missing_filename) {
|
if (missing_filename) {
|
||||||
data.path = missing_filename;
|
data.file.path = missing_filename;
|
||||||
data.force = force;
|
data.force = force;
|
||||||
|
|
||||||
session = perf_session__new(&data, false, NULL);
|
session = perf_session__new(&data, false, NULL);
|
||||||
|
|
|
@ -51,7 +51,9 @@ static int perf_session__list_build_ids(bool force, bool with_hits)
|
||||||
{
|
{
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = force,
|
.force = force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -2572,7 +2572,7 @@ static int perf_c2c__report(int argc, const char **argv)
|
||||||
if (!input_name || !strlen(input_name))
|
if (!input_name || !strlen(input_name))
|
||||||
input_name = "perf.data";
|
input_name = "perf.data";
|
||||||
|
|
||||||
data.path = input_name;
|
data.file.path = input_name;
|
||||||
data.force = symbol_conf.force;
|
data.force = symbol_conf.force;
|
||||||
|
|
||||||
err = setup_display(display);
|
err = setup_display(display);
|
||||||
|
|
|
@ -707,7 +707,7 @@ static void data__fprintf(void)
|
||||||
|
|
||||||
data__for_each_file(i, d)
|
data__for_each_file(i, d)
|
||||||
fprintf(stdout, "# [%d] %s %s\n",
|
fprintf(stdout, "# [%d] %s %s\n",
|
||||||
d->idx, d->data.path,
|
d->idx, d->data.file.path,
|
||||||
!d->idx ? "(Baseline)" : "");
|
!d->idx ? "(Baseline)" : "");
|
||||||
|
|
||||||
fprintf(stdout, "#\n");
|
fprintf(stdout, "#\n");
|
||||||
|
@ -778,14 +778,14 @@ static int __cmd_diff(void)
|
||||||
data__for_each_file(i, d) {
|
data__for_each_file(i, d) {
|
||||||
d->session = perf_session__new(&d->data, false, &tool);
|
d->session = perf_session__new(&d->data, false, &tool);
|
||||||
if (!d->session) {
|
if (!d->session) {
|
||||||
pr_err("Failed to open %s\n", d->data.path);
|
pr_err("Failed to open %s\n", d->data.file.path);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out_delete;
|
goto out_delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = perf_session__process_events(d->session);
|
ret = perf_session__process_events(d->session);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("Failed to process %s\n", d->data.path);
|
pr_err("Failed to process %s\n", d->data.file.path);
|
||||||
goto out_delete;
|
goto out_delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1288,7 +1288,7 @@ static int data_init(int argc, const char **argv)
|
||||||
data__for_each_file(i, d) {
|
data__for_each_file(i, d) {
|
||||||
struct perf_data *data = &d->data;
|
struct perf_data *data = &d->data;
|
||||||
|
|
||||||
data->path = use_default ? defaults[i] : argv[i];
|
data->file.path = use_default ? defaults[i] : argv[i];
|
||||||
data->mode = PERF_DATA_MODE_READ,
|
data->mode = PERF_DATA_MODE_READ,
|
||||||
data->force = force,
|
data->force = force,
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,9 @@ static int __cmd_evlist(const char *file_name, struct perf_attr_details *details
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_evsel *pos;
|
struct perf_evsel *pos;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = file_name,
|
.path = file_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = details->force,
|
.force = details->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -145,7 +145,7 @@ static s64 perf_event__repipe_auxtrace(struct perf_tool *tool,
|
||||||
if (!inject->output.is_pipe) {
|
if (!inject->output.is_pipe) {
|
||||||
off_t offset;
|
off_t offset;
|
||||||
|
|
||||||
offset = lseek(inject->output.fd, 0, SEEK_CUR);
|
offset = lseek(inject->output.file.fd, 0, SEEK_CUR);
|
||||||
if (offset == -1)
|
if (offset == -1)
|
||||||
return -errno;
|
return -errno;
|
||||||
ret = auxtrace_index__auxtrace_event(&session->auxtrace_index,
|
ret = auxtrace_index__auxtrace_event(&session->auxtrace_index,
|
||||||
|
@ -775,7 +775,9 @@ int cmd_inject(int argc, const char **argv)
|
||||||
.input_name = "-",
|
.input_name = "-",
|
||||||
.samples = LIST_HEAD_INIT(inject.samples),
|
.samples = LIST_HEAD_INIT(inject.samples),
|
||||||
.output = {
|
.output = {
|
||||||
|
.file = {
|
||||||
.path = "-",
|
.path = "-",
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_WRITE,
|
.mode = PERF_DATA_MODE_WRITE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -789,7 +791,7 @@ int cmd_inject(int argc, const char **argv)
|
||||||
"Inject build-ids into the output stream"),
|
"Inject build-ids into the output stream"),
|
||||||
OPT_STRING('i', "input", &inject.input_name, "file",
|
OPT_STRING('i', "input", &inject.input_name, "file",
|
||||||
"input file name"),
|
"input file name"),
|
||||||
OPT_STRING('o', "output", &inject.output.path, "file",
|
OPT_STRING('o', "output", &inject.output.file.path, "file",
|
||||||
"output file name"),
|
"output file name"),
|
||||||
OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
|
OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
|
||||||
"Merge sched-stat and sched-switch for getting events "
|
"Merge sched-stat and sched-switch for getting events "
|
||||||
|
@ -836,7 +838,7 @@ int cmd_inject(int argc, const char **argv)
|
||||||
|
|
||||||
inject.tool.ordered_events = inject.sched_stat;
|
inject.tool.ordered_events = inject.sched_stat;
|
||||||
|
|
||||||
data.path = inject.input_name;
|
data.file.path = inject.input_name;
|
||||||
inject.session = perf_session__new(&data, true, &inject.tool);
|
inject.session = perf_session__new(&data, true, &inject.tool);
|
||||||
if (inject.session == NULL)
|
if (inject.session == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -1949,7 +1949,7 @@ int cmd_kmem(int argc, const char **argv)
|
||||||
return __cmd_record(argc, argv);
|
return __cmd_record(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.path = input_name;
|
data.file.path = input_name;
|
||||||
|
|
||||||
kmem_session = session = perf_session__new(&data, false, &perf_kmem);
|
kmem_session = session = perf_session__new(&data, false, &perf_kmem);
|
||||||
if (session == NULL)
|
if (session == NULL)
|
||||||
|
|
|
@ -1068,7 +1068,9 @@ static int read_events(struct perf_kvm_stat *kvm)
|
||||||
.ordered_events = true,
|
.ordered_events = true,
|
||||||
};
|
};
|
||||||
struct perf_data file = {
|
struct perf_data file = {
|
||||||
|
.file = {
|
||||||
.path = kvm->file_name,
|
.path = kvm->file_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = kvm->force,
|
.force = kvm->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -865,7 +865,9 @@ static int __cmd_report(bool display_info)
|
||||||
.ordered_events = true,
|
.ordered_events = true,
|
||||||
};
|
};
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = force,
|
.force = force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -237,7 +237,9 @@ static int process_sample_event(struct perf_tool *tool,
|
||||||
static int report_raw_events(struct perf_mem *mem)
|
static int report_raw_events(struct perf_mem *mem)
|
||||||
{
|
{
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = mem->force,
|
.force = mem->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -618,7 +618,7 @@ record__switch_output(struct record *rec, bool at_exit)
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
|
fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
|
||||||
data->path, timestamp);
|
data->file.path, timestamp);
|
||||||
|
|
||||||
/* Output tracking events */
|
/* Output tracking events */
|
||||||
if (!at_exit) {
|
if (!at_exit) {
|
||||||
|
@ -1118,7 +1118,7 @@ out_child:
|
||||||
|
|
||||||
fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
|
fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
|
||||||
perf_data__size(data) / 1024.0 / 1024.0,
|
perf_data__size(data) / 1024.0 / 1024.0,
|
||||||
data->path, postfix, samples);
|
data->file.path, postfix, samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
out_delete_session:
|
out_delete_session:
|
||||||
|
@ -1482,7 +1482,7 @@ static struct option __record_options[] = {
|
||||||
OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
|
OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
|
||||||
"list of cpus to monitor"),
|
"list of cpus to monitor"),
|
||||||
OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
|
OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
|
||||||
OPT_STRING('o', "output", &record.data.path, "file",
|
OPT_STRING('o', "output", &record.data.file.path, "file",
|
||||||
"output file name"),
|
"output file name"),
|
||||||
OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
|
OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
|
||||||
&record.opts.no_inherit_set,
|
&record.opts.no_inherit_set,
|
||||||
|
|
|
@ -637,7 +637,7 @@ static int __cmd_report(struct report *rep)
|
||||||
rep->nr_entries += evsel__hists(pos)->nr_entries;
|
rep->nr_entries += evsel__hists(pos)->nr_entries;
|
||||||
|
|
||||||
if (rep->nr_entries == 0) {
|
if (rep->nr_entries == 0) {
|
||||||
ui__error("The %s file has no samples!\n", data->path);
|
ui__error("The %s file has no samples!\n", data->file.path);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,7 +940,7 @@ int cmd_report(int argc, const char **argv)
|
||||||
input_name = "perf.data";
|
input_name = "perf.data";
|
||||||
}
|
}
|
||||||
|
|
||||||
data.path = input_name;
|
data.file.path = input_name;
|
||||||
data.force = symbol_conf.force;
|
data.force = symbol_conf.force;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
|
|
|
@ -1701,7 +1701,9 @@ static int perf_sched__read_events(struct perf_sched *sched)
|
||||||
};
|
};
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = sched->force,
|
.force = sched->force,
|
||||||
};
|
};
|
||||||
|
@ -2903,7 +2905,9 @@ static int perf_sched__timehist(struct perf_sched *sched)
|
||||||
{ "sched:sched_migrate_task", timehist_migrate_task_event, },
|
{ "sched:sched_migrate_task", timehist_migrate_task_event, },
|
||||||
};
|
};
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = sched->force,
|
.force = sched->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -222,7 +222,7 @@ static struct perf_evsel_script *perf_evsel_script__new(struct perf_evsel *evsel
|
||||||
struct perf_evsel_script *es = malloc(sizeof(*es));
|
struct perf_evsel_script *es = malloc(sizeof(*es));
|
||||||
|
|
||||||
if (es != NULL) {
|
if (es != NULL) {
|
||||||
if (asprintf(&es->filename, "%s.%s.dump", data->path, perf_evsel__name(evsel)) < 0)
|
if (asprintf(&es->filename, "%s.%s.dump", data->file.path, perf_evsel__name(evsel)) < 0)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
es->fp = fopen(es->filename, "w");
|
es->fp = fopen(es->filename, "w");
|
||||||
if (es->fp == NULL)
|
if (es->fp == NULL)
|
||||||
|
@ -2591,7 +2591,9 @@ int find_scripts(char **scripts_array, char **scripts_path_array)
|
||||||
DIR *scripts_dir, *lang_dir;
|
DIR *scripts_dir, *lang_dir;
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
};
|
};
|
||||||
char *temp;
|
char *temp;
|
||||||
|
@ -2982,7 +2984,7 @@ int cmd_script(int argc, const char **argv)
|
||||||
argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
|
argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
|
||||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||||
|
|
||||||
data.path = input_name;
|
data.file.path = input_name;
|
||||||
data.force = symbol_conf.force;
|
data.force = symbol_conf.force;
|
||||||
|
|
||||||
if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
|
if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
|
||||||
|
@ -3206,7 +3208,7 @@ int cmd_script(int argc, const char **argv)
|
||||||
goto out_delete;
|
goto out_delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
input = open(data.path, O_RDONLY); /* input_name */
|
input = open(data.file.path, O_RDONLY); /* input_name */
|
||||||
if (input < 0) {
|
if (input < 0) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
perror("failed to open file");
|
perror("failed to open file");
|
||||||
|
|
|
@ -2412,7 +2412,7 @@ static int __cmd_record(int argc, const char **argv)
|
||||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||||
|
|
||||||
if (output_name)
|
if (output_name)
|
||||||
data->path = output_name;
|
data->file.path = output_name;
|
||||||
|
|
||||||
if (run_count != 1 || forever) {
|
if (run_count != 1 || forever) {
|
||||||
pr_err("Cannot use -r option with perf stat record.\n");
|
pr_err("Cannot use -r option with perf stat record.\n");
|
||||||
|
@ -2585,7 +2585,7 @@ static int __cmd_report(int argc, const char **argv)
|
||||||
input_name = "perf.data";
|
input_name = "perf.data";
|
||||||
}
|
}
|
||||||
|
|
||||||
perf_stat.data.path = input_name;
|
perf_stat.data.file.path = input_name;
|
||||||
perf_stat.data.mode = PERF_DATA_MODE_READ;
|
perf_stat.data.mode = PERF_DATA_MODE_READ;
|
||||||
|
|
||||||
session = perf_session__new(&perf_stat.data, false, &perf_stat.tool);
|
session = perf_session__new(&perf_stat.data, false, &perf_stat.tool);
|
||||||
|
|
|
@ -1602,7 +1602,9 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name)
|
||||||
{ "syscalls:sys_exit_select", process_exit_poll },
|
{ "syscalls:sys_exit_select", process_exit_poll },
|
||||||
};
|
};
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = tchart->force,
|
.force = tchart->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -2533,7 +2533,9 @@ static int trace__replay(struct trace *trace)
|
||||||
{ "probe:vfs_getname", trace__vfs_getname, },
|
{ "probe:vfs_getname", trace__vfs_getname, },
|
||||||
};
|
};
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = input_name,
|
.path = input_name,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = trace->force,
|
.force = trace->force,
|
||||||
};
|
};
|
||||||
|
|
|
@ -30,7 +30,9 @@ static int session_write_header(char *path)
|
||||||
{
|
{
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = path,
|
.path = path,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_WRITE,
|
.mode = PERF_DATA_MODE_WRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -46,7 +48,7 @@ static int session_write_header(char *path)
|
||||||
session->header.data_size += DATA_SIZE;
|
session->header.data_size += DATA_SIZE;
|
||||||
|
|
||||||
TEST_ASSERT_VAL("failed to write header",
|
TEST_ASSERT_VAL("failed to write header",
|
||||||
!perf_session__write_header(session, session->evlist, data.fd, true));
|
!perf_session__write_header(session, session->evlist, data.file.fd, true));
|
||||||
|
|
||||||
perf_session__delete(session);
|
perf_session__delete(session);
|
||||||
|
|
||||||
|
@ -57,7 +59,9 @@ static int check_cpu_topology(char *path, struct cpu_map *map)
|
||||||
{
|
{
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
|
.file = {
|
||||||
.path = path,
|
.path = path,
|
||||||
|
},
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -1578,7 +1578,7 @@ int bt_convert__perf2ctf(const char *input, const char *path,
|
||||||
{
|
{
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct perf_data data = {
|
struct perf_data data = {
|
||||||
.path = input,
|
.file.path = input,
|
||||||
.mode = PERF_DATA_MODE_READ,
|
.mode = PERF_DATA_MODE_READ,
|
||||||
.force = opts->force,
|
.force = opts->force,
|
||||||
};
|
};
|
||||||
|
@ -1650,7 +1650,7 @@ int bt_convert__perf2ctf(const char *input, const char *path,
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"[ perf data convert: Converted '%s' into CTF data '%s' ]\n",
|
"[ perf data convert: Converted '%s' into CTF data '%s' ]\n",
|
||||||
data.path, path);
|
data.file.path, path);
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"[ perf data convert: Converted and wrote %.3f MB (%" PRIu64 " samples",
|
"[ perf data convert: Converted and wrote %.3f MB (%" PRIu64 " samples",
|
||||||
|
|
|
@ -28,16 +28,16 @@ static bool check_pipe(struct perf_data *data)
|
||||||
int fd = perf_data__is_read(data) ?
|
int fd = perf_data__is_read(data) ?
|
||||||
STDIN_FILENO : STDOUT_FILENO;
|
STDIN_FILENO : STDOUT_FILENO;
|
||||||
|
|
||||||
if (!data->path) {
|
if (!data->file.path) {
|
||||||
if (!fstat(fd, &st) && S_ISFIFO(st.st_mode))
|
if (!fstat(fd, &st) && S_ISFIFO(st.st_mode))
|
||||||
is_pipe = true;
|
is_pipe = true;
|
||||||
} else {
|
} else {
|
||||||
if (!strcmp(data->path, "-"))
|
if (!strcmp(data->file.path, "-"))
|
||||||
is_pipe = true;
|
is_pipe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_pipe)
|
if (is_pipe)
|
||||||
data->fd = fd;
|
data->file.fd = fd;
|
||||||
|
|
||||||
return data->is_pipe = is_pipe;
|
return data->is_pipe = is_pipe;
|
||||||
}
|
}
|
||||||
|
@ -46,13 +46,13 @@ static int check_backup(struct perf_data *data)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
if (!stat(data->path, &st) && st.st_size) {
|
if (!stat(data->file.path, &st) && st.st_size) {
|
||||||
/* TODO check errors properly */
|
/* TODO check errors properly */
|
||||||
char oldname[PATH_MAX];
|
char oldname[PATH_MAX];
|
||||||
snprintf(oldname, sizeof(oldname), "%s.old",
|
snprintf(oldname, sizeof(oldname), "%s.old",
|
||||||
data->path);
|
data->file.path);
|
||||||
unlink(oldname);
|
unlink(oldname);
|
||||||
rename(data->path, oldname);
|
rename(data->file.path, oldname);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -64,13 +64,13 @@ static int open_file_read(struct perf_data *data)
|
||||||
int fd;
|
int fd;
|
||||||
char sbuf[STRERR_BUFSIZE];
|
char sbuf[STRERR_BUFSIZE];
|
||||||
|
|
||||||
fd = open(data->path, O_RDONLY);
|
fd = open(data->file.path, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
|
|
||||||
pr_err("failed to open %s: %s", data->path,
|
pr_err("failed to open %s: %s", data->file.path,
|
||||||
str_error_r(err, sbuf, sizeof(sbuf)));
|
str_error_r(err, sbuf, sizeof(sbuf)));
|
||||||
if (err == ENOENT && !strcmp(data->path, "perf.data"))
|
if (err == ENOENT && !strcmp(data->file.path, "perf.data"))
|
||||||
pr_err(" (try 'perf record' first)");
|
pr_err(" (try 'perf record' first)");
|
||||||
pr_err("\n");
|
pr_err("\n");
|
||||||
return -err;
|
return -err;
|
||||||
|
@ -81,13 +81,13 @@ static int open_file_read(struct perf_data *data)
|
||||||
|
|
||||||
if (!data->force && st.st_uid && (st.st_uid != geteuid())) {
|
if (!data->force && st.st_uid && (st.st_uid != geteuid())) {
|
||||||
pr_err("File %s not owned by current user or root (use -f to override)\n",
|
pr_err("File %s not owned by current user or root (use -f to override)\n",
|
||||||
data->path);
|
data->file.path);
|
||||||
goto out_close;
|
goto out_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!st.st_size) {
|
if (!st.st_size) {
|
||||||
pr_info("zero-sized data (%s), nothing to do!\n",
|
pr_info("zero-sized data (%s), nothing to do!\n",
|
||||||
data->path);
|
data->file.path);
|
||||||
goto out_close;
|
goto out_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,11 +107,11 @@ static int open_file_write(struct perf_data *data)
|
||||||
if (check_backup(data))
|
if (check_backup(data))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
fd = open(data->path, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC,
|
fd = open(data->file.path, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC,
|
||||||
S_IRUSR|S_IWUSR);
|
S_IRUSR|S_IWUSR);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
pr_err("failed to open %s : %s\n", data->path,
|
pr_err("failed to open %s : %s\n", data->file.path,
|
||||||
str_error_r(errno, sbuf, sizeof(sbuf)));
|
str_error_r(errno, sbuf, sizeof(sbuf)));
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
|
@ -124,7 +124,7 @@ static int open_file(struct perf_data *data)
|
||||||
fd = perf_data__is_read(data) ?
|
fd = perf_data__is_read(data) ?
|
||||||
open_file_read(data) : open_file_write(data);
|
open_file_read(data) : open_file_write(data);
|
||||||
|
|
||||||
data->fd = fd;
|
data->file.fd = fd;
|
||||||
return fd < 0 ? -1 : 0;
|
return fd < 0 ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,21 +133,21 @@ int perf_data__open(struct perf_data *data)
|
||||||
if (check_pipe(data))
|
if (check_pipe(data))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!data->path)
|
if (!data->file.path)
|
||||||
data->path = "perf.data";
|
data->file.path = "perf.data";
|
||||||
|
|
||||||
return open_file(data);
|
return open_file(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void perf_data__close(struct perf_data *data)
|
void perf_data__close(struct perf_data *data)
|
||||||
{
|
{
|
||||||
close(data->fd);
|
close(data->file.fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t perf_data__write(struct perf_data *data,
|
ssize_t perf_data__write(struct perf_data *data,
|
||||||
void *buf, size_t size)
|
void *buf, size_t size)
|
||||||
{
|
{
|
||||||
return writen(data->fd, buf, size);
|
return writen(data->file.fd, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_data__switch(struct perf_data *data,
|
int perf_data__switch(struct perf_data *data,
|
||||||
|
@ -162,30 +162,30 @@ int perf_data__switch(struct perf_data *data,
|
||||||
if (perf_data__is_read(data))
|
if (perf_data__is_read(data))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (asprintf(&new_filepath, "%s.%s", data->path, postfix) < 0)
|
if (asprintf(&new_filepath, "%s.%s", data->file.path, postfix) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only fire a warning, don't return error, continue fill
|
* Only fire a warning, don't return error, continue fill
|
||||||
* original file.
|
* original file.
|
||||||
*/
|
*/
|
||||||
if (rename(data->path, new_filepath))
|
if (rename(data->file.path, new_filepath))
|
||||||
pr_warning("Failed to rename %s to %s\n", data->path, new_filepath);
|
pr_warning("Failed to rename %s to %s\n", data->file.path, new_filepath);
|
||||||
|
|
||||||
if (!at_exit) {
|
if (!at_exit) {
|
||||||
close(data->fd);
|
close(data->file.fd);
|
||||||
ret = perf_data__open(data);
|
ret = perf_data__open(data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (lseek(data->fd, pos, SEEK_SET) == (off_t)-1) {
|
if (lseek(data->file.fd, pos, SEEK_SET) == (off_t)-1) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
pr_debug("Failed to lseek to %zu: %s",
|
pr_debug("Failed to lseek to %zu: %s",
|
||||||
pos, strerror(errno));
|
pos, strerror(errno));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = data->fd;
|
ret = data->file.fd;
|
||||||
out:
|
out:
|
||||||
free(new_filepath);
|
free(new_filepath);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -8,9 +8,13 @@ enum perf_data_mode {
|
||||||
PERF_DATA_MODE_READ,
|
PERF_DATA_MODE_READ,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct perf_data {
|
struct perf_data_file {
|
||||||
const char *path;
|
const char *path;
|
||||||
int fd;
|
int fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct perf_data {
|
||||||
|
struct perf_data_file file;
|
||||||
bool is_pipe;
|
bool is_pipe;
|
||||||
bool force;
|
bool force;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
|
@ -34,7 +38,7 @@ static inline int perf_data__is_pipe(struct perf_data *data)
|
||||||
|
|
||||||
static inline int perf_data__fd(struct perf_data *data)
|
static inline int perf_data__fd(struct perf_data *data)
|
||||||
{
|
{
|
||||||
return data->fd;
|
return data->file.fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long perf_data__size(struct perf_data *data)
|
static inline unsigned long perf_data__size(struct perf_data *data)
|
||||||
|
|
|
@ -2889,7 +2889,7 @@ int perf_session__read_header(struct perf_session *session)
|
||||||
if (f_header.data.size == 0) {
|
if (f_header.data.size == 0) {
|
||||||
pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n"
|
pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n"
|
||||||
"Was the 'perf record' command properly terminated?\n",
|
"Was the 'perf record' command properly terminated?\n",
|
||||||
data->path);
|
data->file.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
nr_attrs = f_header.attrs.size / f_header.attr_size;
|
nr_attrs = f_header.attrs.size / f_header.attr_size;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue