From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C46B747F3CD; Mon, 14 Sep 2026 12:55:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789390537; cv=none; b=Hj//9Sgnk633RDWnpshZWRF+LUkoM/o/r9nOGnu5psNzSd1IEVeV+7nYXMe6imaa4o0W0arTd1aBQ08Dx7/rYbokKtvVeB+NX1/CbwDWebBWp9oNq9zKA4fpQFbsZv+ZEdXAko10ITvN2yWJC87Gv8rD20LmAU7LQRCVRCSS2Xs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789390537; c=relaxed/simple; bh=vcrRIdYWh+TkOxK4o1c2gaMNRQIaB920uKIymM152zw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JYFh9BIITvmQ+dkuFTIwaECH4U010z1fAvx5FX26oP+I4rW1MWBw+zq5wjY369/QhkRtjOwMrv/gGV3Cfb6XooFR0vdpe6KsAXGgT+/bbWbneiBm4f0bwFIYBiYU5XFEmBp+cXeiMNuWY4neaqnACHRtCbf5gBdXJLvpbPwQN8k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ic0gfbZb; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ic0gfbZb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DF4381F000FF; Mon, 14 Sep 2026 12:55:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789390535; bh=PesbCEUBP8rgUhZmjbD7d1nULNdWHibHSP58/nvi8YQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Ic0gfbZbhw+sNIqCu/wZQg+n5DO0CYWrqjCupd+w/TKl6cE5P5zeNqx8FFn2uQsIB gZ3VvD4gd3THd3Fwdw3CQvGdUyq5drB1vzC8meaZipSUAIIsMAfEr6yIm+frWGsWR3 HjwDrET6IU0X1ZBERwqLMuO0cKBdvBEm4UhzJrsOfuTQXZbHri4khuAD0V/mgo/tm5 FPyQvOh1Km89553iu/i4RjSyEXTM+JRht7QAv8WqM8IdV0kwk9pJX40ghr6e0UD7bS c6lWjkXLAMpZYyJlQIcgd58yK1Sqj5vjq7ZmGZFfu7DyqaefCQI9Mr+pArsIlaLOY5 USzlzLVsrUnoA== From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Thomas Gleixner , James Clark , Jiri Olsa , Ian Rogers , Adrian Hunter , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo Subject: [PATCH 8/9] perf mem record: Request PERF_SAMPLE_CPU by default Date: Mon, 14 Sep 2026 09:54:48 -0300 Message-ID: <20260914125451.2045-9-acme@kernel.org> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260914125451.2045-1-acme@kernel.org> References: <20260914125451.2045-1-acme@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Arnaldo Carvalho de Melo The data-type profiling per-sample stream keys cross-CPU contention on sample->cpu: without PERF_SAMPLE_CPU the cpu field is the (u32)-1 "no CPU info" sentinel, documented as such in perf_session__deliver_event(), and same-instance reads and writes from different cores are indistinguishable from same-CPU traffic, so pahole's false-sharing detector cannot tell them apart. builtin-record.c already defines --sample-cpu and 'perf mem record' forwards unknown options to the record parser, so passing it explicitly works today; make it the default, next to the -d (addr) and -W (weight) the command already requests, documenting it in perf-mem(1). The rec_argv array is sized as nine arguments per memory PMU plus the user arguments, not counting the arguments __cmd_record() adds itself, up to eight with all the optional flags. On PMUs with separate load and store events the four event arguments plus the fixed ones already filled the array to its last slot, so this new argument would write past it; reserve space for the fixed arguments explicitly. Assisted-by: LLM Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/Documentation/perf-mem.txt | 4 ++++ tools/perf/builtin-mem.c | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-mem.txt b/tools/perf/Documentation/perf-mem.txt index 4d164836d0943119..fe51c5e3333dc4a0 100644 --- a/tools/perf/Documentation/perf-mem.txt +++ b/tools/perf/Documentation/perf-mem.txt @@ -14,6 +14,10 @@ DESCRIPTION ----------- "perf mem record" runs a command and gathers memory operation data from it, into perf.data. Perf record options are accepted and are passed through. +It also requests the address (-d), the weight (-W, where supported) and the +CPU id (--sample-cpu) of every sampled access by default; the CPU id is what +lets per-sample analysis tell reads and writes to the same data from +different cores apart from same-CPU traffic. "perf mem report" displays the result. It invokes perf report with the right set of options to display a memory access profile. By default, loads diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 6101a26b3a781e69..6f38cda1a45ada16 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -99,8 +99,13 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem, argc = parse_options(argc, argv, options, record_usage, PARSE_OPT_KEEP_UNKNOWN); - /* Max number of arguments multiplied by number of PMUs that can support them. */ - rec_argc = argc + 9 * (perf_pmu__mem_events_num_mem_pmus(pmu) + 1); + /* + * Max number of arguments multiplied by number of PMUs that can + * support them, plus the arguments added directly below, at most: + * "record", "-W", "-d", "--sample-cpu", "--phys-data", + * "--data-page-size", "--all-user" and "--all-kernel". + */ + rec_argc = argc + 8 + 9 * (perf_pmu__mem_events_num_mem_pmus(pmu) + 1); if (mem->cpu_list) rec_argc += 2; @@ -135,6 +140,15 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem, rec_argv[i++] = "-d"; + /* + * The data-type profiling per-sample stream keys cross-CPU + * contention on sample->cpu (PERF_SAMPLE_CPU); without it the cpu + * field is the (u32)-1 'no CPU info' sentinel and same-instance + * reads and writes from different cores are indistinguishable + * from same-CPU traffic. + */ + rec_argv[i++] = "--sample-cpu"; + if (mem->phys_addr) rec_argv[i++] = "--phys-data"; -- 2.55.0