From nobody Tue Dec 2 02:42:57 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F19963043AD for ; Tue, 18 Nov 2025 21:13:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763500436; cv=none; b=rN7UaS/FMXQyts2H37yHVKWuupGSg9dGCOR8GQhvSCo484b003swWAueFUCD5I88Mv5VU6/P0KkNLwdwHrORXW22Z97y/Nt3AZj6s9URQRpFxnnYKeeG9KaxrKjDxbIAghitf0nJGidEfGCm1O44rD2Rjex/+clAG8YlORbZPlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763500436; c=relaxed/simple; bh=fo0lBaCJ8TXTQqOuC1gBkqakdTjeMs11JfM9cjP6hW0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=ONyk0YMK2XEZBtYTu1HsCR4eVEKkUSHcjDebNyP4W0oz+lXkyp9mBlwOnWc7sQL9hkNLvMHIT6Vcmoo/NsSmUZbukRE779nzC6bq1layNzQ5wV42CYzMBfMMtGUqSRnpEb+8hAEjVtzNGAGd/OMqoFtSgNpZ1TRApeJOfgre9Qo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fglS7Pc8; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fglS7Pc8" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b6097ca315bso13510701a12.3 for ; Tue, 18 Nov 2025 13:13:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1763500434; x=1764105234; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=aIy78jgPSEM3mVGd6NsXjCvGBSaI620v4P+4Y2lxS/o=; b=fglS7Pc8ALdtQJtWX3jcnUVcBa9HkHzTWigqs5kmNz/PezH14IPqeZz4ttUyZU9yjd n2dydAzg7s8Cmbv1lLu6gcZMRPru+83ey7HQbLf5aSWrIiRHcmKyiS02R7//TobhD335 gXXCIzkwAbcxUqUnzIbSwIUdI2MesyS+9K7lYu9K6CCa2W5FTOiLGkV9lj1wQv5KO8tf j+j+UF1T0mc2hsaaDcGPTnJIEjtLf/zRxTwFQU4wqtMF2D4/4X+tG/jIDtTWBd5YB4kH 2RqtlxtwPCGAYjYZOBERM6cEc+k+ioxdcGuUMqJz2d0k/9+cVJK089/ZcK7X2CKqB2CD lGpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763500434; x=1764105234; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aIy78jgPSEM3mVGd6NsXjCvGBSaI620v4P+4Y2lxS/o=; b=IzbKT7hSaXAO80P4o42jbPoP8gdeJZfSNxud5Zm8xgbhi7axp3+xB68e+2tbiEZzl0 lEUSQYXFLHIX/5+SRhW13pcejs9KDz/c6A+KJ2M6bkEpHqErSP39IJxBz8AX4MJyYmP1 Upecl6EG9QnL/kzSVTowWk9qTpiJyFyvDumBZR4JhDwlIt/yOrcLk3xcqUC7noqBBG32 NNAYFLDtLUWGnViyCz4to5UQt/lyLfWglSzVM3McbpyI46b/t4j0XCjogT065Ipns+9J AP1DSp7tOjnJJKOl6VSzLM9xb3cml+DDTHqGiMud7wFUBNlVjgkRNkxMWa7nB7FWj63n 0hHw== X-Forwarded-Encrypted: i=1; AJvYcCW8BtlPDI2yNqjlTqxZOf9/WEXTBKVH2NM0nBXhmb8IbtiatAqRY9LWr8JFoUCZeExI/W/cS9z0BlSq124=@vger.kernel.org X-Gm-Message-State: AOJu0Yxdur+eJbSfNjEdfuTh1HU56esGGZVFL28rdceDHFYLsAD8o3Fk gIydLdHbEhsTZVIqPe3mqmnZsCCgACcvJaIkU8vQkE119IReYPChYQjZ5CKXPvF9p78ZTvMI0X6 OeWRK7kKHFg== X-Google-Smtp-Source: AGHT+IFoglpTPhHBQpx7ZM56yubi4+LYL6d9Q4jDCWS2Dl//TIZIFoBoOq//bqAg44uNADK+ncYr6Mmjtpzz X-Received: from dybqf15.prod.google.com ([2002:a05:7301:648f:b0:2a4:6ffc:87c9]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7301:152c:b0:2a4:3594:72ee with SMTP id 5a478bee46e88-2a4abb54770mr7416694eec.29.1763500434069; Tue, 18 Nov 2025 13:13:54 -0800 (PST) Date: Tue, 18 Nov 2025 13:13:24 -0800 In-Reply-To: <20251118211326.1840989-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251118211326.1840989-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog Message-ID: <20251118211326.1840989-2-irogers@google.com> Subject: [PATCH v5 1/3] perf stat: Read tool events last From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Dr. David Alan Gilbert" , Yang Li , James Clark , Thomas Falcon , Thomas Richter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Andi Kleen , Dapeng Mi Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When reading a metric like memory bandwidth on multiple sockets, the additional sockets will be on CPUS > 0. Because of the affinity reading, the counters are read on CPU 0 along with the time, then the later sockets are read. This can lead to the later sockets having a bandwidth larger than is possible for the period of time. To avoid this move the reading of tool events to occur after all other events are read. Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 45 +++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index ca1c80c141b6..5c06e9b61821 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -366,7 +366,7 @@ static int read_counter_cpu(struct evsel *counter, int = cpu_map_idx) return 0; } =20 -static int read_affinity_counters(void) +static int read_counters_with_affinity(void) { struct evlist_cpu_iterator evlist_cpu_itr; struct affinity saved_affinity, *affinity; @@ -387,6 +387,9 @@ static int read_affinity_counters(void) if (evsel__is_bpf(counter)) continue; =20 + if (evsel__is_tool(counter)) + continue; + if (!counter->err) counter->err =3D read_counter_cpu(counter, evlist_cpu_itr.cpu_map_idx); } @@ -412,16 +415,46 @@ static int read_bpf_map_counters(void) return 0; } =20 -static int read_counters(void) +static int read_tool_counters(void) { - if (!stat_config.stop_read_counter) { - if (read_bpf_map_counters() || - read_affinity_counters()) - return -1; + struct evsel *counter; + + evlist__for_each_entry(evsel_list, counter) { + int idx; + + if (!evsel__is_tool(counter)) + continue; + + perf_cpu_map__for_each_idx(idx, counter->core.cpus) { + if (!counter->err) + counter->err =3D read_counter_cpu(counter, idx); + } } return 0; } =20 +static int read_counters(void) +{ + int ret; + + if (stat_config.stop_read_counter) + return 0; + + // Read all BPF counters first. + ret =3D read_bpf_map_counters(); + if (ret) + return ret; + + // Read non-BPF and non-tool counters next. + ret =3D read_counters_with_affinity(); + if (ret) + return ret; + + // Read the tool counters last. This way the duration_time counter + // should always be greater than any other counter's enabled time. + return read_tool_counters(); +} + static void process_counters(void) { struct evsel *counter; --=20 2.52.0.rc1.455.g30608eb744-goog