Commit fc807b6b authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf pmu-events: Add retirement latency to JSON events inside of perf

The updated Intel vendor events add retirement latency for
graniterapids:

  https://lore.kernel.org/lkml/20250322063403.364981-14-irogers@google.com/



This change makes those values available within an alias/event within a
PMU and saves them into the evsel at event parse time.

When no TPEBS data is available the default values are substituted in
for TMA metrics that are using retirement latency events - currently
just those on graniterapids.

Reviewed-by: default avatarKan Liang <kan.liang@linux.intel.com>
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarWeilin Wang <weilin.wang@intel.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: Andreas Färber <afaerber@suse.de>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Link: https://lore.kernel.org/r/20250414174134.3095492-16-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f19306f0
Loading
Loading
Loading
Loading
+111 −105

File changed.

Preview size limit exceeded, changes collapsed.

+6 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ _json_event_attributes = [
    'event',
    # Short things in alphabetical order.
    'compat', 'deprecated', 'perpkg', 'unit',
    # Retirement latency specific to Intel granite rapids currently.
    'retirement_latency_mean', 'retirement_latency_min',
    'retirement_latency_max',
    # Longer things (the last won't be iterated over during decompress).
    'long_desc'
]
@@ -341,6 +344,9 @@ class JsonEvent:
    self.perpkg = jd.get('PerPkg')
    self.aggr_mode = convert_aggr_mode(jd.get('AggregationMode'))
    self.deprecated = jd.get('Deprecated')
    self.retirement_latency_mean = jd.get('RetirementLatencyMean')
    self.retirement_latency_min = jd.get('RetirementLatencyMin')
    self.retirement_latency_max = jd.get('RetirementLatencyMax')
    self.metric_name = jd.get('MetricName')
    self.metric_group = jd.get('MetricGroup')
    self.metricgroup_no_group = jd.get('MetricgroupNoGroup')
+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ struct pmu_event {
	const char *long_desc;
	const char *pmu;
	const char *unit;
	const char *retirement_latency_mean;
	const char *retirement_latency_min;
	const char *retirement_latency_max;
	bool perpkg;
	bool deprecated;
};
+6 −0
Original line number Diff line number Diff line
@@ -177,6 +177,12 @@ struct evsel {
	/* For tool events */
	/* Beginning time subtracted when the counter is read. */
	union {
		/* Defaults for retirement latency events. */
		struct _retirement_latency {
			double mean;
			double min;
			double max;
		} retirement_latency;
		/* duration_time is a single global time. */
		__u64 start_time;
		/*
+37 −15
Original line number Diff line number Diff line
@@ -514,19 +514,40 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread)
	 * process. Allow the sample reader a chance to read by releasing and
	 * reacquiring the lock.
	 */
	if (&t->nd == tpebs_results.next) {
	if (t && &t->nd == tpebs_results.next) {
		ret = tpebs_send_record_cmd(EVLIST_CTL_CMD_PING_TAG);
		mutex_unlock(tpebs_mtx_get());
		if (ret)
			return ret;
		mutex_lock(tpebs_mtx_get());
	}
	if (t == NULL || t->stats.n == 0) {
		/* No sample data, use default. */
		if (tpebs_recording) {
			pr_warning_once(
				"Using precomputed retirement latency data as no samples\n");
		}
		val = 0;
		switch (tpebs_mode) {
		case TPEBS_MODE__MIN:
		val = rint(t->stats.min);
			val = rint(evsel->retirement_latency.min);
			break;
		case TPEBS_MODE__MAX:
		val = rint(t->stats.max);
			val = rint(evsel->retirement_latency.max);
			break;
		default:
		case TPEBS_MODE__LAST:
		case TPEBS_MODE__MEAN:
			val = rint(evsel->retirement_latency.mean);
			break;
		}
	} else {
		switch (tpebs_mode) {
		case TPEBS_MODE__MIN:
			val = t->stats.min;
			break;
		case TPEBS_MODE__MAX:
			val = t->stats.max;
			break;
		case TPEBS_MODE__LAST:
			val = t->last;
@@ -536,6 +557,7 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread)
			val = rint(t->stats.mean);
			break;
		}
	}
	mutex_unlock(tpebs_mtx_get());

	if (old_count) {
Loading