summaryrefslogtreecommitdiff
path: root/tools/perf/util/intel-tpebs.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/intel-tpebs.c')
-rw-r--r--tools/perf/util/intel-tpebs.c52
1 files changed, 37 insertions, 15 deletions
diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c
index 5a158395c7fa..7fd6cae1063e 100644
--- a/tools/perf/util/intel-tpebs.c
+++ b/tools/perf/util/intel-tpebs.c
@@ -514,27 +514,49 @@ 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());
}
- switch (tpebs_mode) {
- case TPEBS_MODE__MIN:
- val = rint(t->stats.min);
- break;
- case TPEBS_MODE__MAX:
- val = rint(t->stats.max);
- break;
- case TPEBS_MODE__LAST:
- val = t->last;
- break;
- default:
- case TPEBS_MODE__MEAN:
- val = rint(t->stats.mean);
- break;
+ 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(evsel->retirement_latency.min);
+ break;
+ case TPEBS_MODE__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;
+ break;
+ default:
+ case TPEBS_MODE__MEAN:
+ val = rint(t->stats.mean);
+ break;
+ }
}
mutex_unlock(tpebs_mtx_get());