mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
perf inject: Add --vm-time-correlation option
Intel PT timestamps are affected by virtualization. Add a new option that will allow the Intel PT decoder to correlate the timestamps and translate the virtual machine timestamps to host timestamps. The advantages of making this a separate step, rather than a part of normal decoding are that it is simpler to implement, and it needs to be done only once. This patch adds only the option. Later patches add Intel PT support. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: https://lore.kernel.org/r/20210430070309.17624-6-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
2a525f6a55
commit
83d7f5f1ad
3 changed files with 60 additions and 0 deletions
|
@ -31,6 +31,7 @@
|
|||
#include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/string.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
@ -698,6 +699,36 @@ static void strip_init(struct perf_inject *inject)
|
|||
evsel->handler = drop_sample;
|
||||
}
|
||||
|
||||
static int parse_vm_time_correlation(const struct option *opt, const char *str, int unset)
|
||||
{
|
||||
struct perf_inject *inject = opt->value;
|
||||
const char *args;
|
||||
char *dry_run;
|
||||
|
||||
if (unset)
|
||||
return 0;
|
||||
|
||||
inject->itrace_synth_opts.set = true;
|
||||
inject->itrace_synth_opts.vm_time_correlation = true;
|
||||
inject->in_place_update = true;
|
||||
|
||||
if (!str)
|
||||
return 0;
|
||||
|
||||
dry_run = skip_spaces(str);
|
||||
if (!strncmp(dry_run, "dry-run", strlen("dry-run"))) {
|
||||
inject->itrace_synth_opts.vm_tm_corr_dry_run = true;
|
||||
inject->in_place_update_dry_run = true;
|
||||
args = dry_run + strlen("dry-run");
|
||||
} else {
|
||||
args = str;
|
||||
}
|
||||
|
||||
inject->itrace_synth_opts.vm_tm_corr_args = strdup(args);
|
||||
|
||||
return inject->itrace_synth_opts.vm_tm_corr_args ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
static int __cmd_inject(struct perf_inject *inject)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
@ -739,6 +770,15 @@ static int __cmd_inject(struct perf_inject *inject)
|
|||
else if (!strncmp(name, "sched:sched_stat_", 17))
|
||||
evsel->handler = perf_inject__sched_stat;
|
||||
}
|
||||
} else if (inject->itrace_synth_opts.vm_time_correlation) {
|
||||
session->itrace_synth_opts = &inject->itrace_synth_opts;
|
||||
memset(&inject->tool, 0, sizeof(inject->tool));
|
||||
inject->tool.id_index = perf_event__process_id_index;
|
||||
inject->tool.auxtrace_info = perf_event__process_auxtrace_info;
|
||||
inject->tool.auxtrace = perf_event__process_auxtrace;
|
||||
inject->tool.auxtrace_error = perf_event__process_auxtrace_error;
|
||||
inject->tool.ordered_events = true;
|
||||
inject->tool.ordering_requires_timestamps = true;
|
||||
} else if (inject->itrace_synth_opts.set) {
|
||||
session->itrace_synth_opts = &inject->itrace_synth_opts;
|
||||
inject->itrace_synth_opts.inject = true;
|
||||
|
@ -880,6 +920,9 @@ int cmd_inject(int argc, const char **argv)
|
|||
itrace_parse_synth_opts),
|
||||
OPT_BOOLEAN(0, "strip", &inject.strip,
|
||||
"strip non-synthesized events (use with --itrace)"),
|
||||
OPT_CALLBACK_OPTARG(0, "vm-time-correlation", &inject, NULL, "opts",
|
||||
"correlate time between VM guests and the host",
|
||||
parse_vm_time_correlation),
|
||||
OPT_END()
|
||||
};
|
||||
const char * const inject_usage[] = {
|
||||
|
@ -968,5 +1011,6 @@ int cmd_inject(int argc, const char **argv)
|
|||
out_delete:
|
||||
zstd_fini(&(inject.session->zstd_data));
|
||||
perf_session__delete(inject.session);
|
||||
free(inject.itrace_synth_opts.vm_tm_corr_args);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue