From: Kan Liang <kan.li...@intel.com> Save group read results from cycles/ref-cycles/TSC/ASTATE/MSTATE in struct perf_sample. The following sample process function can easily use them to caculate freq/CPU%/CORE_BUSY% and add them in hists.
Signed-off-by: Kan Liang <kan.li...@intel.com> --- tools/perf/util/event.h | 11 +++++++++++ tools/perf/util/session.c | 16 ++++++++++++++++ tools/perf/util/session.h | 10 ---------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index c53f363..f7aabe3 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -176,6 +176,16 @@ enum { PERF_IP_FLAG_TRACE_BEGIN |\ PERF_IP_FLAG_TRACE_END) +enum perf_freq_perf_index { + FREQ_PERF_TSC = 0, + FREQ_PERF_APERF = 1, + FREQ_PERF_MPERF = 2, + FREQ_PERF_CYCLES = 3, + FREQ_PERF_REF_CYCLES = 4, + + FREQ_PERF_MAX +}; + struct perf_sample { u64 ip; u32 pid, tid; @@ -191,6 +201,7 @@ struct perf_sample { u64 data_src; u32 flags; u16 insn_len; + u64 freq_perf_data[FREQ_PERF_MAX]; void *raw_data; struct ip_callchain *callchain; struct branch_stack *branch_stack; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 6dd20b5..939dfed 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -999,6 +999,8 @@ static int deliver_sample_value(struct perf_evlist *evlist, struct machine *machine) { struct perf_sample_id *sid = perf_evlist__id2sid(evlist, v->id); + struct perf_evsel *evsel; + u64 nr = 0; if (sid) { sample->id = v->id; @@ -1011,6 +1013,20 @@ static int deliver_sample_value(struct perf_evlist *evlist, return 0; } + if (perf_evsel__is_group_leader(sid->evsel)) { + evsel = sid->evsel; + SET_FREQ_PERF_VALUE(evsel, sample->freq_perf_data, + sample->read.group.values[nr].value); + evlist__for_each_continue(evlist, evsel) { + if ((evsel->leader != sid->evsel) || + (++nr >= sample->read.group.nr)) + break; + + SET_FREQ_PERF_VALUE(evsel, sample->freq_perf_data, + sample->read.group.values[nr].value); + } + } + return tool->sample(tool, event, sample, sid->evsel, machine); } diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index df2094d..8c3cae8 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -46,16 +46,6 @@ struct perf_session { #define PERF_MSR_APERF 1 #define PERF_MSR_MPERF 2 -enum perf_freq_perf_index { - FREQ_PERF_TSC = 0, - FREQ_PERF_APERF = 1, - FREQ_PERF_MPERF = 2, - FREQ_PERF_CYCLES = 3, - FREQ_PERF_REF_CYCLES = 4, - - FREQ_PERF_MAX -}; - #define SET_FREQ_PERF_VALUE(event, array, value) \ { \ if (event->attr.type == msr_pmu->type) { \ -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/