[PATCH] perf iostat: Do not compute interval deltas a second time
From: lirongqing
Date: Thu Nov 05 2026 - 03:05:53 EST
From: Li RongQing <lirongqing@xxxxxxxxx>
process_counter_values() now computes deltas directly in evsel->counts
for global aggregation too. It saves the current cumulative raw count in
prev_raw_counts before iostat prints the interval.
Subtracting prev_raw_counts again can therefore underflow the count.
Worse, replacing the saved raw count with the interval delta corrupts
the baseline used to calculate the next interval.
Use the already computed delta and leave prev_raw_counts untouched.
Fixes: f976bc6b6bfc ("perf stat: Aggregate events using evsel->stats->aggr")
Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx>
---
tools/perf/arch/x86/util/iostat.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/tools/perf/arch/x86/util/iostat.c b/tools/perf/arch/x86/util/iostat.c
index 0cf0f93..fac6b4a 100644
--- a/tools/perf/arch/x86/util/iostat.c
+++ b/tools/perf/arch/x86/util/iostat.c
@@ -434,20 +434,12 @@ void iostat_print_metric(struct perf_stat_config *config, struct evsel *evsel,
struct perf_stat_output_ctx *out)
{
double iostat_value = 0;
- u64 prev_count_val = 0;
const char *iostat_metric = iostat_metric_by_idx(evsel->core.idx);
u8 die = ((struct iio_root_port *)evsel->priv)->die;
struct perf_counts_values *count = perf_counts(evsel->counts, die, 0);
if (count && count->run && count->ena) {
- if (evsel->prev_raw_counts && !out->force_header) {
- struct perf_counts_values *prev_count =
- perf_counts(evsel->prev_raw_counts, die, 0);
-
- prev_count_val = prev_count->val;
- prev_count->val = count->val;
- }
- iostat_value = (count->val - prev_count_val) /
+ iostat_value = count->val /
((double) count->run / count->ena);
}
out->print_metric(config, out->ctx, METRIC_THRESHOLD_UNKNOWN, "%8.0f", iostat_metric,
--
2.9.4