perf script: Support Retire Latency
authorKan Liang <kan.liang@linux.intel.com>
Wed, 4 Jan 2023 20:13:49 +0000 (12:13 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 3 Feb 2023 20:26:40 +0000 (17:26 -0300)
The Retire Latency field is added in the var3_w of the
PERF_SAMPLE_WEIGHT_STRUCT. The Retire Latency reports the number of
elapsed core clocks between the retirement of the instruction indicated
by the Instruction Pointer field of the PEBS record and the retirement
of the prior instruction. That's quite useful to display the information
with perf script.

Add a new field retire_lat for the Retire Latency information.

Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20230104201349.1451191-9-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-script.c

index 339b441..a792214 100644 (file)
@@ -132,6 +132,7 @@ enum perf_output_field {
        PERF_OUTPUT_MACHINE_PID     = 1ULL << 37,
        PERF_OUTPUT_VCPU            = 1ULL << 38,
        PERF_OUTPUT_CGROUP          = 1ULL << 39,
+       PERF_OUTPUT_RETIRE_LAT      = 1ULL << 40,
 };
 
 struct perf_script {
@@ -203,6 +204,7 @@ struct output_option {
        {.str = "machine_pid", .field = PERF_OUTPUT_MACHINE_PID},
        {.str = "vcpu", .field = PERF_OUTPUT_VCPU},
        {.str = "cgroup", .field = PERF_OUTPUT_CGROUP},
+       {.str = "retire_lat", .field = PERF_OUTPUT_RETIRE_LAT},
 };
 
 enum {
@@ -278,7 +280,7 @@ static struct {
                              PERF_OUTPUT_ADDR | PERF_OUTPUT_DATA_SRC |
                              PERF_OUTPUT_WEIGHT | PERF_OUTPUT_PHYS_ADDR |
                              PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE |
-                             PERF_OUTPUT_INS_LAT,
+                             PERF_OUTPUT_INS_LAT | PERF_OUTPUT_RETIRE_LAT,
 
                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
        },
@@ -551,6 +553,10 @@ static int evsel__check_attr(struct evsel *evsel, struct perf_session *session)
                return -EINVAL;
        }
 
+       if (PRINT_FIELD(RETIRE_LAT) &&
+           evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT_STRUCT, "WEIGHT_STRUCT", PERF_OUTPUT_RETIRE_LAT))
+               return -EINVAL;
+
        return 0;
 }
 
@@ -2188,6 +2194,9 @@ static void process_event(struct perf_script *script,
        if (PRINT_FIELD(INS_LAT))
                fprintf(fp, "%16" PRIu16, sample->ins_lat);
 
+       if (PRINT_FIELD(RETIRE_LAT))
+               fprintf(fp, "%16" PRIu16, sample->retire_lat);
+
        if (PRINT_FIELD(IP)) {
                struct callchain_cursor *cursor = NULL;
 
@@ -3877,7 +3886,7 @@ int cmd_script(int argc, const char **argv)
                     "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
                     "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth,"
                     "phys_addr,metric,misc,srccode,ipc,tod,data_page_size,"
-                    "code_page_size,ins_lat,machine_pid,vcpu,cgroup",
+                    "code_page_size,ins_lat,machine_pid,vcpu,cgroup,retire_lat",
                     parse_output_fields),
        OPT_BOOLEAN('a', "all-cpus", &system_wide,
                    "system-wide collection from all CPUs"),