From nobody Sat Sep 26 13:47:22 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 904F94CCDD7; Mon, 31 Aug 2026 20:46:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209197; cv=none; b=qwgSnQLM2s9t5jioNbXc2CbK8LgbR/GKTdjLcH/PYgHcKUl+lW51nLyO8Icn1syvmBZjtaC9zLtZ+RWSPxPo42LWZ+AsP+OU0A4THuoWm1WdlmE35iskW/HazHtq6m0qnyTA64Gct+8KuAGbKS7Sd7Pg3xivlcNRwRQAT1my1B8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209197; c=relaxed/simple; bh=mLejFowYm2X6VHgkPdi17Jgt/N1ot0OaV91zeWDUK4M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=vE9p0R2GbtvcVOydK4Np1h55y4FUswu+0oykHMVikqh3zkFOj/SBak7cJPph1LUW3NSWSRCNVvLfb5SzN4aBoeFKqRwUGbeznFJavNXRyW1h+CSDz2oNZazv7yhAGXSfdSJlWiiJjoY4fY3DDGEvDNcI+xEaBCe9bd7YBVibTGg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=G45Zrmwt; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="G45Zrmwt" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209196; x=1819745196; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mLejFowYm2X6VHgkPdi17Jgt/N1ot0OaV91zeWDUK4M=; b=G45ZrmwtfR9E7tOMOsyjEmahanRGlME7kbT7J+ZT9HONbMCKf+AbJiIq yY3s8zG2hptAcXR+nQ4TFrZS/t8S5OT5POEwf/U8Rbg5intbnrVmG3mnB b/An74topuDDS5/P60dl30xNF1jWBKmR3WJ1EGlRXraXWEK0m5BZitC1M FdT+d8u64nXO9A62isvzwhItB6FnITuhx2Z4xBU3XpEpHFj8HjpHiwEPi DyRK5DHwOnF5zigutyQg/3GnTTAAO6lq9SGxnVdzaygIhN7Y3JUSLKog8 fK/PTJKQYnUpHI9RllLXm4vdc0MT0p1s7lN1YoyamvJzA4kuCsmCufVBQ g==; X-CSE-ConnectionGUID: 42ICh6BJRgynuHXLKN+FGg== X-CSE-MsgGUID: oWp8YFcWRPyprrOAQWv+jA== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147273" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147273" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:33 -0700 X-CSE-ConnectionGUID: YD4ck0oCTAKKFK6y8PLk1A== X-CSE-MsgGUID: uqkEGwWfTRudOSJW9ERjRA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268345988" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:32 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 1/6] perf mem: Fix size tracking for mem_lvl's in perf_script__meminfo_scnprintf() Date: Mon, 31 Aug 2026 15:46:08 -0500 Message-ID: <20260831204613.2793526-2-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When printing memory info in perf script, the entire size of the buffer is passed to perf_mem__lvl_scnprintf() instead of the remaining size. Pass the remaining buffer size instead. This issue was detected by sashiko during an internal code review. Assisted-by: Sashiko:gemini-3.1-pro-preview Fixes: fdefc3750e847 ("perf mem: Print memory operation type") Reviewed-by: Dapeng Mi Reviewed-by: Ian Rogers Signed-off-by: Thomas Falcon --- tools/perf/util/mem-events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c index 0b49fce251fc..4e490f9cd348 100644 --- a/tools/perf/util/mem-events.c +++ b/tools/perf/util/mem-events.c @@ -610,7 +610,7 @@ int perf_script__meminfo_scnprintf(char *out, size_t sz= , const struct mem_info * i +=3D scnprintf(out, sz, "|OP "); i +=3D perf_mem__op_scnprintf(out + i, sz - i, mem_info); i +=3D scnprintf(out + i, sz - i, "|LVL "); - i +=3D perf_mem__lvl_scnprintf(out + i, sz, mem_info); + i +=3D perf_mem__lvl_scnprintf(out + i, sz - i, mem_info); i +=3D scnprintf(out + i, sz - i, "|SNP "); i +=3D perf_mem__snp_scnprintf(out + i, sz - i, mem_info); i +=3D scnprintf(out + i, sz - i, "|TLB "); --=20 2.43.0 From nobody Sat Sep 26 13:47:22 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 5187B38D400; Mon, 31 Aug 2026 20:46:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209197; cv=none; b=SOVVT/+JC/0IVc3NzbuamVfrqzH79fb5ipM3BNyfmwAJVJMtQpJG22A15nWt7mox+FgrMAA8yB4FdtsU2oa44UASPy35MGA+I6ljRzqus3vakJJ5ja7fzXLC3x+Atc0swr8ZmFF21A10aSaxX8hklLG66svDKxrbuDqk+J0n1ZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209197; c=relaxed/simple; bh=pur8Eze4+XrwJ9Gf7uH6Gld/z1arU4xEqnuXcuwoyG8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OyDYUDgznISrei/LgQr5Si65ti33gxBGPb0bK1szSWyWFudd78YQQznKm0WQj9dZoy7mi1HyPkgOpGU5MKtxqrmWFICQffXfeWnfXsJ6jXyuqoQR4IKTDR2edFB3xyavlcW/xmqoSeS9JQMES1OfGJRvldpdr9Puh6FPqFr9li0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=LT0J5fX0; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="LT0J5fX0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209196; x=1819745196; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pur8Eze4+XrwJ9Gf7uH6Gld/z1arU4xEqnuXcuwoyG8=; b=LT0J5fX0B6fb+QzdLU819sRI589It8kNBWRNWSBvgntZ1CKfECCYsmS7 5BJRnn2SNcY2po0uZcXtTnyD44tisLiju15d2d+XYFcRREQ9aGdxU/tLi BXqnMEM198gGzCGKsedUbAVw38ceDHJTwVqrmd96+/rhvSj2b42kpb4QT KGcyHxoHi/HvfymQbwG+nDe7+Ffwv34t1weVlbn9uz2nANr2dXOf0mJQa +WTkPg+SYRporA+1KbfPRZSODbx0TWVzT60GH9MLmS5gTclhKl7q3beOn IcJ9AOFl01SW+1ccqMeM+cHIyRzKKRu3Xj3jl82p3MteP8I7DUjdncfKS A==; X-CSE-ConnectionGUID: phVTIJuwTaeCL0ZgyqnSdA== X-CSE-MsgGUID: NSqvWZ5yREafasuX28KoWw== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147282" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147282" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:34 -0700 X-CSE-ConnectionGUID: 9rkBwTJyTGSj4t4YaJT/bA== X-CSE-MsgGUID: nVluE44HTUaEGwXAO7TuHQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268345996" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:33 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 2/6] perf mem: Add support for printing PERF_MEM_LVLNUM_L0 Date: Mon, 31 Aug 2026 15:46:09 -0500 Message-ID: <20260831204613.2793526-3-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Dapeng Mi Add support for printing PERF_MEM_LVLNUM_L0 in perf mem report. The L0 cache is newly added a small piece of cache which is the closest, lowest-latency memory cache tied directly to the execution pipeline. The table "Table 9-4. Data Source Field Encodings for Panther Cove and Coyote Cove Microarchitectures" in the ISE doc chapter "9.2.1 Panther Cove and Coyote Cove Microarchitectures Memory Auxiliary Field Layout"[1] indicates the code "01H" means the "L0 Hit - Minimal latency core cache hit. This request was satisfied by the L0 data cache." [1]: https://www.intel.com/content/www/us/en/content-details/922690/intel-a= rchitecture-instruction-set-extensions-programming-reference.html Assisted-by: Sashiko:gemini-3.1-pro-preview Reviewed-by: Dapeng Mi Reviewed-by: Ian Rogers Signed-off-by: Dapeng Mi Signed-off-by: Thomas Falcon --- v3: Included more information about the L0 cache in the commit message. --- tools/perf/Documentation/perf-record.txt | 2 +- tools/perf/util/bpf-filter.l | 1 + tools/perf/util/mem-events.c | 5 +++++ tools/perf/util/mem-events.h | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Document= ation/perf-record.txt index 178f483140ed..b54032efe41c 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -212,7 +212,7 @@ OPTIONS The can be one of: (for any term) na, load, store, pfetch, exec (for mem_op) - l1, l2, l3, l4, cxl, io, any_cache, lfb, ram, pmem (for mem_lvl) + l0, l1, l2, l3, l4, cxl, io, any_cache, lfb, ram, pmem (for mem_lvl) na, none, hit, miss, hitm, fwd, peer (for mem_snoop) remote (for mem_remote) na, locked (for mem_locked) diff --git a/tools/perf/util/bpf-filter.l b/tools/perf/util/bpf-filter.l index 6aa65ade3385..1be9df6550fc 100644 --- a/tools/perf/util/bpf-filter.l +++ b/tools/perf/util/bpf-filter.l @@ -131,6 +131,7 @@ store { return constant(PERF_MEM_OP_STORE); } pfetch { return constant(PERF_MEM_OP_PFETCH); } exec { return constant(PERF_MEM_OP_EXEC); } =20 +l0 { return constant(PERF_MEM_LVLNUM_L0); } l1 { return constant(PERF_MEM_LVLNUM_L1); } l2 { return constant(PERF_MEM_LVLNUM_L2); } l3 { return constant(PERF_MEM_LVLNUM_L3); } diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c index 4e490f9cd348..4fd48fd20055 100644 --- a/tools/perf/util/mem-events.c +++ b/tools/perf/util/mem-events.c @@ -391,6 +391,7 @@ static const char * const mem_lvlnum[] =3D { [PERF_MEM_LVLNUM_L4] =3D "L4", [PERF_MEM_LVLNUM_L2_MHB] =3D "L2 MHB", [PERF_MEM_LVLNUM_MSC] =3D "Memory-side Cache", + [PERF_MEM_LVLNUM_L0] =3D "L0", [PERF_MEM_LVLNUM_UNC] =3D "Uncached", [PERF_MEM_LVLNUM_CXL] =3D "CXL", [PERF_MEM_LVLNUM_IO] =3D "I/O", @@ -831,6 +832,8 @@ int mem_stat_index(const enum mem_stat_type mst, const = u64 val) } case PERF_MEM_STAT_CACHE: switch (src.mem_lvl_num) { + case PERF_MEM_LVLNUM_L0: + return MEM_STAT_CACHE_L0; case PERF_MEM_LVLNUM_L1: return MEM_STAT_CACHE_L1; case PERF_MEM_LVLNUM_L2: @@ -915,6 +918,8 @@ const char *mem_stat_name(const enum mem_stat_type mst,= const int idx) } case PERF_MEM_STAT_CACHE: switch (idx) { + case MEM_STAT_CACHE_L0: + return "L0"; case MEM_STAT_CACHE_L1: return "L1"; case MEM_STAT_CACHE_L2: diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h index 5b98076904b0..daa22748f9fe 100644 --- a/tools/perf/util/mem-events.h +++ b/tools/perf/util/mem-events.h @@ -109,6 +109,7 @@ enum mem_stat_op { }; =20 enum mem_stat_cache { + MEM_STAT_CACHE_L0, MEM_STAT_CACHE_L1, MEM_STAT_CACHE_L2, MEM_STAT_CACHE_L3, --=20 2.43.0 From nobody Sat Sep 26 13:47:23 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 AA15D3932FC; Mon, 31 Aug 2026 20:46:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209198; cv=none; b=Rr2NEZpU52GCgje75agmCmvdGmFUCKs0vIjG+l97KqXYePIpaWyQ9gJp3i+2ZG/kMEjV8190Wmc2uFshfGvKlSgNJauHE1iPg4z+s2Q7gh23bYkSOLA8UH4aLYA37MSN3PitZZSEXhiyljdfQCGU4SC35HOzdpOQtu0jd8wW78I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209198; c=relaxed/simple; bh=PL+jkjRAHRRBFngZ6ir98WmVYXmr3qY9WMpapfBqNn8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oYDUqkrsvaCZ8ekCt+/9afyL8Nv16cEdTz+wy+4PmBlLTeZYg4RJDfVg5JD0slo5rPFAD3KP7jNpqzTLJOMRX/bi18XG3DT2D6GxzoFJhumNWfWOA6mc41zx5xS7BKs+xG3WEnAMxv9dWCDljYX3vxcWCdMWqrnFxzu47u8TMm8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Da4bESg0; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Da4bESg0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209197; x=1819745197; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PL+jkjRAHRRBFngZ6ir98WmVYXmr3qY9WMpapfBqNn8=; b=Da4bESg0WX7E1eDWniP6d0xyjkU5ibCz8709oYKIWKYupPOa6zpTYhzF QM2T4vKjqZLSDbSYwkb1Kjv1kURBX0OfofeMOWEg4kyFOIS86MvICE0Hb N0pnCzxZZBEj9tCHbI6/ggu0UIUQV1I3wjQ0YVR0+gp5TeSFUtyW3yPMm ukI+MAo2rx/3J0loL6z1eFH1xdsMSpRR7C5Rk+YiBYfy4FQCRknP5ktn2 IwMqdZ0UEuuEvby2u/LbCuvnLKOPJlMrvlHCgoJfujms67Et2puz7qWAy 6B6+bO4PkfcfjVelMneghOrQKiUYhQIgd3hjUQfYNxGYOeoRki3N9XKYZ Q==; X-CSE-ConnectionGUID: B3IO8G4iT62w2+pe+Z76Fg== X-CSE-MsgGUID: 3FLz1t0MTHCuBV4Afa1jHg== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147297" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147297" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:36 -0700 X-CSE-ConnectionGUID: dfuEqYm5SLaHWZatvAj2gQ== X-CSE-MsgGUID: y6hD+hbpQ7SukE9bViPrWg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268346001" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:34 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 3/6] perf header: Support memory ranges Date: Mon, 31 Aug 2026 15:46:10 -0500 Message-ID: <20260831204613.2793526-4-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Memory ranges were created to track different types of memory, such as persistent, high bandwidth, or CXL-attached, that may be present on a system for performance monitoring and resource control purposes. Memory range data are parsed from the ACPI MRRM table and exposed to userspace tools via sysfs [1]. Memory range data is read from: /sys/firmware/acpi/memory_ranges/rangeX With the following attributes: u64 base; u64 length; int node; u8 local_region_id; u8 remote_region_id; Read memory range data from sysfs if present and save it in the header of the perf data file under a new feature bit, HEADER_MEMORY_RANGES (35). Memory range data can be viewed with the --header or --header-only options of perf-report and perf-script. Example output: # memory ranges (nr 5): # range0: [0x0000000000000000-0x00000000bfffffff], node =3D 0, local_regio= n_id =3D 0, remote_region_id =3D 255 # range1: [0x0000000100000000-0x000000203fffffff], node =3D 0, local_regio= n_id =3D 0, remote_region_id =3D 255 # range2: [0x0000008000000000-0x0000027fffffffff], node =3D -2, local_regi= on_id =3D 1, remote_region_id =3D 255 # range3: [0x0000028000000000-0x0000047fffffffff], node =3D -2, local_regi= on_id =3D 1, remote_region_id =3D 255 # range4: [0x0000048000000000-0x000004ffffffffff], node =3D -2, local_regi= on_id =3D 1, remote_region_id =3D 255 [1]: https://lore.kernel.org/lkml/20250505173819.419271-1-tony.luck@intel.c= om/ Assisted-by: Sashiko:gemini-3.1-pro-preview Assisted-by: GitHub-Copilot:claude-opus-4-8 Reviewed-by: Ian Rogers Signed-off-by: Thomas Falcon --- v4: -- Fixed bounds checking for local and remote region IDs in memory_range__read(), which made region "255" invalid v3: -- Added missing ff->size check in process_memory_ranges() -- used open/openat to read memory range sysfs files in memory_range__read() -- Removed path name and file name buffers in memory_range__read(), instead pass path name from as a parameter from memory_range__parse() -- use calloc instead of zalloc in memory_range__parse() and process_memory_ranges() -- Removed redundant check for existance of memory range directory in memory_range__read() -- Included examples of memory range output in commit message v2: -- Added check for NULL return of sysfs__mountpoint() when parsing memory ranges in sysfs -- increased MAX_MEMORY_RANGES sanity check from 64 to 256 based on ACPI MRRM table implementation in Linux kernel -- added comment for MAX_MEMORY_RANGES to clarify that it is a sanity check for malformed perf.data files -- removed a line of code was removed from util/env.h but was added back in v1 due to bad rebase --- .../Documentation/perf.data-file-format.txt | 13 ++ tools/perf/builtin-inject.c | 1 + tools/perf/util/env.c | 1 + tools/perf/util/env.h | 10 + tools/perf/util/header.c | 203 ++++++++++++++++++ tools/perf/util/header.h | 1 + 6 files changed, 229 insertions(+) diff --git a/tools/perf/Documentation/perf.data-file-format.txt b/tools/per= f/Documentation/perf.data-file-format.txt index b90cba9168f8..1f8e7d8e9ae2 100644 --- a/tools/perf/Documentation/perf.data-file-format.txt +++ b/tools/perf/Documentation/perf.data-file-format.txt @@ -478,6 +478,19 @@ The size of the cacheline in bytes. Format: =20 unsigned int cln_size; =20 + HEADER_MEMORY_RANGES =3D 35, + +List of memory ranges. The format of the data is as below. + +u32 nr_memory_ranges; +struct memory_range { + u64 base; + u64 length; + int node; + u8 local_region_id; + u8 remote_region_id; +}; [nr_memory_ranges] + other bits are reserved and should be ignored for now HEADER_FEAT_BITS =3D 256, =20 diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 70bbfad5653e..169617a884d3 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2306,6 +2306,7 @@ static bool keep_feat(struct perf_inject *inject, int= feat) case HEADER_PMU_CAPS: case HEADER_CPU_DOMAIN_INFO: case HEADER_CLN_SIZE: + case HEADER_MEMORY_RANGES: return true; /* Information that can be updated */ case HEADER_BUILD_ID: diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index c0e2b9d5f0b2..50993b0dedc5 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -297,6 +297,7 @@ void perf_env__exit(struct perf_env *env) zfree(&env->pmu_caps[i].pmu_name); } zfree(&env->pmu_caps); + zfree(&env->memory_ranges); free_cpu_domain_info(env->cpu_domain, env->schedstat_version, env->nr_cpu= s_avail); } =20 diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index 7acca39b42ff..23d35425efe3 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -68,6 +68,14 @@ struct cpu_domain_map { struct domain_info **domains; }; =20 +struct memory_range { + u64 base; + u64 length; + int node; + u8 local_region_id; + u8 remote_region_id; +}; + struct perf_env { char *hostname; char *os_release; @@ -100,6 +108,7 @@ struct perf_env { int nr_cpu_pmu_caps; int nr_hybrid_nodes; int nr_pmus_with_caps; + int nr_memory_ranges; char *cmdline; const char **cmdline_argv; char *sibling_cores; @@ -122,6 +131,7 @@ struct perf_env { unsigned long long memory_bsize; struct hybrid_node *hybrid_nodes; struct pmu_caps *pmu_caps; + struct memory_range *memory_ranges; #ifdef HAVE_LIBBPF_SUPPORT /* * bpf_info_lock protects bpf rbtrees. This is needed because the diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7db7da090a1e..83416ce395d7 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -92,6 +92,7 @@ #define MAX_PMU_CAPS 512 #define MAX_PMU_MAPPINGS 4096 #define MAX_SCHED_DOMAINS 64 +#define MAX_MEMORY_RANGES 256 =20 /* * magic2 =3D "PERFILE2" @@ -1892,6 +1893,132 @@ static int write_cpu_domain_info(struct feat_fd *ff, return ret; } =20 +static int memory_range__read(struct memory_range *range, const char *path) +{ + char buf[32]; + ssize_t n; + int dfd, fd, tmp, ret =3D -1; + + dfd =3D open(path, O_RDONLY | O_DIRECTORY); + if (dfd < 0) + return -1; + +#define _R(name, dst, conv) \ + fd =3D openat(dfd, name, O_RDONLY); \ + if (fd < 0) \ + goto out; \ + n =3D read(fd, buf, sizeof(buf) - 1); \ + close(fd); \ + if (n <=3D 0) \ + goto out; \ + buf[n] =3D '\0'; \ + dst =3D conv(buf, NULL, 0); + + _R("base", range->base, strtoull); + _R("length", range->length, strtoull); + _R("node", range->node, strtol); + _R("local_region_id", tmp, strtol); + if (tmp < 0 || tmp > UINT8_MAX) + goto out; + range->local_region_id =3D tmp; + _R("remote_region_id", tmp, strtol); + if (tmp < 0 || tmp > UINT8_MAX) + goto out; + range->remote_region_id =3D tmp; +#undef _R + + ret =3D 0; +out: + close(dfd); + return ret; +} + +static int memory_range__parse(struct memory_range **ranges) +{ + const char *sysfs =3D sysfs__mountpoint(); + int i, err, nr_memory_ranges =3D 0; + char path[PATH_MAX]; + struct stat st; + + if (!sysfs) + return 0; + + scnprintf(path, PATH_MAX, "%s/firmware/acpi/memory_ranges", sysfs); + if (stat(path, &st)) + return 0; + + while (1) { + scnprintf(path, PATH_MAX, + "%s/firmware/acpi/memory_ranges/range%d", + sysfs, nr_memory_ranges); + if (stat(path, &st)) + break; + + nr_memory_ranges++; + } + + if (nr_memory_ranges =3D=3D 0) + return 0; + + *ranges =3D calloc(nr_memory_ranges, sizeof(struct memory_range)); + if (!(*ranges)) + return -ENOMEM; + + for (i =3D 0; i < nr_memory_ranges; i++) { + struct memory_range range; + + scnprintf(path, PATH_MAX, + "%s/firmware/acpi/memory_ranges/range%d", sysfs, i); + err =3D memory_range__read(&range, path); + if (err < 0) + goto out_error; + + (*ranges)[i] =3D range; + } + + return nr_memory_ranges; + +out_error: + zfree(ranges); + return -1; +} + +static int write_memory_ranges(struct feat_fd *ff, + struct evlist *evlist __maybe_unused) +{ + struct memory_range *ranges =3D NULL; + int nr_memory_ranges =3D 0, ret; + + nr_memory_ranges =3D memory_range__parse(&ranges); + if (nr_memory_ranges < 0) + return nr_memory_ranges; + + ret =3D do_write(ff, &nr_memory_ranges, sizeof(nr_memory_ranges)); + if (ret < 0) + goto out; + + for (int i =3D 0; i < nr_memory_ranges; i++) { + ret =3D do_write(ff, &ranges[i].base, sizeof(u64)); + if (ret < 0) + goto out; + ret =3D do_write(ff, &ranges[i].length, sizeof(u64)); + if (ret < 0) + goto out; + ret =3D do_write(ff, &ranges[i].node, sizeof(u32)); + if (ret < 0) + goto out; + ret =3D do_write(ff, &ranges[i].local_region_id, sizeof(u8)); + if (ret < 0) + goto out; + ret =3D do_write(ff, &ranges[i].remote_region_id, sizeof(u8)); + if (ret < 0) + goto out; + } +out: + zfree(&ranges); + return ret; +} + static void print_hostname(struct feat_fd *ff, FILE *fp) { fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname); @@ -2629,6 +2756,23 @@ static void print_cpu_domain_info(struct feat_fd *ff= , FILE *fp) } } =20 +static void print_memory_ranges(struct feat_fd *ff, FILE *fp) +{ + struct memory_range *ranges =3D ff->ph->env.memory_ranges; + int nr_memory_ranges =3D ff->ph->env.nr_memory_ranges; + int i; + + fprintf(fp, "# memory ranges (nr %d):\n", nr_memory_ranges); + + for (i =3D 0; i < nr_memory_ranges; i++) { + fprintf(fp, "# range%u: [0x%016" PRIx64 "-0x%016" PRIx64, + i, ranges[i].base, ranges[i].base + ranges[i].length - 1); + fprintf(fp, "], node =3D %d, local_region_id =3D %d, remote_region_id = =3D %d\n", + ranges[i].node, ranges[i].local_region_id, + ranges[i].remote_region_id); + } +} + static int __event_process_build_id(struct perf_record_header_build_id *be= v, char *filename, struct perf_session *session) @@ -4202,6 +4346,64 @@ static int process_cpu_domain_info(struct feat_fd *f= f, void *data __maybe_unused return ret; } =20 +static int process_memory_ranges(struct feat_fd *ff, void *data __maybe_un= used) +{ + struct perf_env *env =3D &ff->ph->env; + struct memory_range *ranges, *r; + u32 nr_memory_ranges, i; + + if (do_read_u32(ff, &nr_memory_ranges)) + return -1; + + if (!nr_memory_ranges) { + pr_debug("memory ranges not available\n"); + return 0; + } + + /* According to version 1.1 of the ACPI MRRM table, the maximum + * number of memory regions can be at most 255. Do a sanity check + * here to guard against a malformed perf.data file. + */ + if (nr_memory_ranges >=3D MAX_MEMORY_RANGES) { + pr_err("Invalid memory_ranges: nr_memory_ranges (%u) > %u\n", + nr_memory_ranges, MAX_MEMORY_RANGES); + return -1; + } + + if (ff->size < sizeof(u32) + nr_memory_ranges * (2 * sizeof(u64) + sizeof= (u32) + 2 * sizeof(u8))) { + pr_err("Invalid HEADER_MEMORY_RANGES: section too small (%zu) for %u ran= ge entries\n", + ff->size, nr_memory_ranges); + return -1; + } + + ranges =3D calloc(nr_memory_ranges, sizeof(*ranges)); + if (!ranges) + return -1; + + for (i =3D 0; i < nr_memory_ranges; i++) { + r =3D &ranges[i]; + + if (do_read_u64(ff, &r->base)) + goto error; + if (do_read_u64(ff, &r->length)) + goto error; + if (do_read_u32(ff, (u32 *) &r->node)) + goto error; + if (__do_read(ff, &r->local_region_id, sizeof(u8))) + goto error; + if (__do_read(ff, &r->remote_region_id, sizeof(u8))) + goto error; + } + + env->memory_ranges =3D ranges; + env->nr_memory_ranges =3D nr_memory_ranges; + + return 0; +error: + zfree(&ranges); + return -1; +} + #define FEAT_OPR(n, func, __full_only) \ [HEADER_##n] =3D { \ .name =3D __stringify(n), \ @@ -4266,6 +4468,7 @@ const struct perf_header_feature_ops feat_ops[HEADER_= LAST_FEATURE] =3D { FEAT_OPR(CPU_DOMAIN_INFO, cpu_domain_info, true), FEAT_OPR(E_MACHINE, e_machine, false), FEAT_OPR(CLN_SIZE, cln_size, false), + FEAT_OPR(MEMORY_RANGES, memory_ranges, false), }; =20 struct header_print_data { diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 5e03f884b7cc..765037762758 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -56,6 +56,7 @@ enum { HEADER_CPU_DOMAIN_INFO, HEADER_E_MACHINE, HEADER_CLN_SIZE, + HEADER_MEMORY_RANGES, HEADER_LAST_FEATURE, HEADER_FEAT_BITS =3D 256, }; --=20 2.43.0 From nobody Sat Sep 26 13:47:23 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 1DC9A399892; Mon, 31 Aug 2026 20:46:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209201; cv=none; b=XSFyVKPV3CFHKzhhncoiH6FDKZKF1+ygLyC1rQFfOM4/PpyWD6WsR/ZQy5XudK6+E6ij3Si4fo+sq533ASyiNq6tbBBa/g1dd/QDZ2zPbtSuSW5WwF8OwabzGUf6AOg4B7nY3wAe59lYw2ONHYMHsGTviWp2z0bbwTf1J/UsWCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209201; c=relaxed/simple; bh=4lVnsZWNFyYsWDPyZwhLUn3taw4SkU37RONLawR1ANQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pxNFMkrPyLz5bzdxJF8tn9O+jQ1znh+YpYLYHc12g/lfSdirKdUwm/aay2T2bn9CEflO5cOi29cUUVkjlezr8y2GVBZCI6RgFHubHnnjT616h/2jx2j76rF8JZjy3xxReN8p9fiYkgwLubbTT4kvyy7fD/p5/7LckGpU8G+KWjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NMHEs3g2; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NMHEs3g2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209199; x=1819745199; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4lVnsZWNFyYsWDPyZwhLUn3taw4SkU37RONLawR1ANQ=; b=NMHEs3g2oUtCE+5CGxJt5JOIg3vHEymZRfKruSs/por2qfAFS3knyBOz fB4SuSod4Dc44Eybkgb/UCcvISQlPqS1MXUVA/xlAYHTmlq2/HY1cjUDE UpsCpYaD4BKhTGOfacAHRbu2+buOjk69neXnxFuujS16cDXjAdP2GXDff sDo/17nufZyaraEW7NFI03l6UQhMIa0MPvLgoM31csY0EtJFwDveuLu+3 SjsFzBynRfyO8hXgBwhoHYe6oIoS+mPs5deoiBTb5kNHRwpsOICHDEJ7G fyXGL5EsqLjtuqtutQmb8uDCDX/UI/E2B9ErVDMCsN48wEiUrpNskbWX+ Q==; X-CSE-ConnectionGUID: 2PfBUS/KTpSRrPuOx4hIqw== X-CSE-MsgGUID: C+D3TvExQPuKRCDa9i0qAg== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147306" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147306" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:38 -0700 X-CSE-ConnectionGUID: rvyU3P4QTCuZttPjIfc4kg== X-CSE-MsgGUID: WffE7GUvSvmA0U6yeAo85g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268346009" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:36 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 4/6] perf tools: Show memory region in perf-c2c subcommand Date: Mon, 31 Aug 2026 15:46:11 -0500 Message-ID: <20260831204613.2793526-5-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Dapeng Mi Add memory region field to the cacheline list view to help users identify the memory region to which the cacheline belongs. The memory region field was included with the introduction of support for the Off-module Response facility (OMR) [1] in Intel's Diamond Rapids and Nova Lake architectures. An example of the new perf c2c output including the memory region field is shown below: Shared Data Cache Line Table (112 entries, sorted on Total HITMs) --------------- Cacheline -------------- Tot ------- Load Hitm= ------- Total Total Total Index Address Region Node PA cnt Hitm Total LclHitm = RmtHitm records Loads Stores 0 0xff1b7032a1e8c5c0 N/A 1 47 2.25% 50 44 = 6 1024 1023 1 1 0xff1b6ff3255bb880 N/A 0 11 1.62% 36 34 = 2 96 93 4 2 0xff1b70328e3b9880 N/A 1 13 1.49% 33 33 = 0 100 91 9 3 0xff1b70328b023800 N/A 1 1 1.40% 31 14 = 17 52 48 4 4 0xff1b70328e3b9c00 N/A 1 1 1.31% 29 27 = 2 67 33 34 5 0xff1b70328b0237c0 N/A 1 1 1.26% 28 10 = 18 154 150 4 6 0xff1b6ff3255bbc00 N/A 0 1 1.13% 25 25 = 0 48 25 23 7 0xff1b6ff3255bba40 N/A 0 1 0.99% 22 22 = 0 46 23 23 8 0xff3ab9ba50255c80 N/A N/A 0 0.77% 17 15 = 2 35 35 0 9 0xff3ab9ba503e3040 N/A N/A 0 0.77% 17 11 = 6 37 37 1 10 0xff1b703289e88f40 N/A 1 33 0.72% 16 9 = 7 69 63 6 11 0xff1b70328e3b9a40 N/A 1 1 0.68% 15 15 = 0 43 17 26 12 0xff1b7032c9fd6a40 N/A 1 15 0.68% 15 15 = 0 57 54 4 13 0xff1b7032a1e8c980 N/A 1 27 0.54% 12 11 = 1 761 761 0 14 0xff1b70727ffd57c0 N/A 1 7 0.54% 12 12 = 0 219 218 1 15 0xffffffffaefe2380 N/A 1 1 0.50% 11 8 = 3 14 14 0 Note: DMR simics does not support memory regions. Since the output is captured on SPR, the memory region field shows "N/A" for all cachelines. [1]: https://lore.kernel.org/all/20260114011750.350569-1-dapeng1.mi@linux.i= ntel.com/ Assisted-by: Sashiko:gemini-3.1-pro-preview Assisted-by: GitHub-Copilot:claude-opus-4-8 Reviewed-by: Ian Rogers Signed-off-by: Dapeng Mi Signed-off-by: Thomas Falcon --- v6: rebased onto 7.3-rc1 v5: make the cacheline header span and ui_quirks() width fixup depend on memory-region availability (Namhyung Kim) v4: correctly handle output_str memory allocation failure v3: make memory region reporting conditional on feature bit --- tools/perf/builtin-c2c.c | 94 ++++++++++++++++++++++++++++++++++++---- tools/perf/util/c2c.h | 1 + 2 files changed, 86 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 715b75d42f2a..c877b5056da0 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -71,6 +71,7 @@ struct perf_c2c { =20 bool show_src; bool show_all; + bool show_mem_region; bool use_stdio; bool stats_only; bool symbol_full; @@ -247,6 +248,18 @@ static void c2c_he__set_node(struct c2c_hist_entry *c2= c_he, } } =20 +static void c2c_he__set_mem_region(struct c2c_hist_entry *c2c_he, + unsigned int mem_region) +{ + if (WARN_ONCE(mem_region > PERF_MEM_REGION_MEM7, + "WARNING: invalid memory region ID\n")) + return; + + /* Update mem_region only if it really accesses memory */ + if (mem_region >=3D PERF_MEM_REGION_MMIO) + c2c_he->mem_region =3D mem_region; +} + static void compute_stats(struct c2c_hist_entry *c2c_he, struct c2c_stats *stats, u64 weight) @@ -305,6 +318,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, struct addr_location al; struct mem_info *mi =3D NULL; struct callchain_cursor *cursor; + unsigned int mem_region; int ret; =20 addr_location__init(&al); @@ -332,6 +346,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, } =20 c2c_decode_stats(&stats, mi); + mem_region =3D mem_info__data_src(mi)->mem_region; =20 he =3D hists__add_entry_ops(&c2c_hists->hists, &c2c_entry_ops, &al, NULL, NULL, mi, NULL, @@ -348,6 +363,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, c2c_he__set_cpu(c2c_he, sample); c2c_he__set_node(c2c_he, sample); c2c_he__set_evsel(c2c_he, evsel); + c2c_he__set_mem_region(c2c_he, mem_region); =20 hists__inc_nr_samples(&c2c_hists->hists, he->filtered); =20 @@ -401,6 +417,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, c2c_he__set_cpu(c2c_he, sample); c2c_he__set_node(c2c_he, sample); c2c_he__set_evsel(c2c_he, evsel); + c2c_he__set_mem_region(c2c_he, mem_region); =20 hists__inc_nr_samples(&c2c_hists->hists, he->filtered); ret =3D hist_entry__append_callchain(he, sample); @@ -539,6 +556,30 @@ dcacheline_node_count(struct perf_hpp_fmt *fmt, struct= perf_hpp *hpp, return scnprintf(hpp->buf, hpp->size, "%*lu", width, c2c_he->paddr_cnt); } =20 +static int +dcacheline_node_mem_region(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width =3D c2c_width(fmt, hpp, he->hists); + struct c2c_hist_entry *c2c_he; + unsigned int mem_region; + char buf[20]; + + c2c_he =3D container_of(he, struct c2c_hist_entry, he); + mem_region =3D c2c_he->mem_region; + + if (mem_region =3D=3D PERF_MEM_REGION_NA) + scnprintf(buf, sizeof(buf), "N/A"); + /* mem_region could only be >=3D PERF_MEM_REGION_MMIO */ + else if (mem_region =3D=3D PERF_MEM_REGION_MMIO) + scnprintf(buf, sizeof(buf), "MMIO"); + else + scnprintf(buf, sizeof(buf), "0x%x", + mem_region - PERF_MEM_REGION_MEM0); + + return scnprintf(hpp->buf, hpp->size, "%*s", width, buf); +} + static int offset_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, struct hist_entry *he) { @@ -1359,6 +1400,14 @@ static struct c2c_dimension dim_dcacheline_node =3D { .width =3D 4, }; =20 +static struct c2c_dimension dim_dcacheline_mem_region =3D { + .header =3D HEADER_LOW("Region"), + .name =3D "dcacheline_mem_region", + .cmp =3D empty_cmp, + .entry =3D dcacheline_node_mem_region, + .width =3D 6, +}; + static struct c2c_dimension dim_dcacheline_count =3D { .header =3D HEADER_LOW("PA cnt"), .name =3D "dcacheline_count", @@ -1790,6 +1839,7 @@ static struct c2c_dimension dim_dcacheline_num_empty = =3D { =20 static struct c2c_dimension *dimensions[] =3D { &dim_dcacheline, + &dim_dcacheline_mem_region, &dim_dcacheline_node, &dim_dcacheline_count, &dim_offset, @@ -2853,8 +2903,11 @@ static int ui_quirks(void) /* Fix the zero line for dcacheline column. */ buf =3D fill_line(chk_double_cl ? "Double-Cacheline" : "Cacheline", dim_dcacheline.width + + (c2c.show_mem_region ? + dim_dcacheline_mem_region.width : 0) + dim_dcacheline_node.width + - dim_dcacheline_count.width + 4); + dim_dcacheline_count.width + + (c2c.show_mem_region ? 6 : 4)); if (!buf) return -ENOMEM; =20 @@ -3106,7 +3159,8 @@ static int perf_c2c__report(int argc, const char **ar= gv) OPT_END() }; int err =3D 0; - const char *output_str, *sort_str =3D NULL; + const char *sort_str =3D NULL; + char *output_str =3D NULL; struct perf_env *env; =20 annotation_options__init(); @@ -3271,9 +3325,16 @@ static int perf_c2c__report(int argc, const char **a= rgv) goto out_mem2node; } =20 - if (c2c.display !=3D DISPLAY_SNP_PEER) - output_str =3D "cl_idx," + c2c.show_mem_region =3D perf_header__has_feat(&session->header, + HEADER_MEMORY_RANGES); + if (c2c.show_mem_region) + dim_dcacheline.header.line[0].span =3D 3; + + if (c2c.display !=3D DISPLAY_SNP_PEER) { + if (asprintf(&output_str, + "cl_idx," "dcacheline," + "%s" "dcacheline_node," "dcacheline_count," "percent_costly_snoop," @@ -3285,10 +3346,17 @@ static int perf_c2c__report(int argc, const char **= argv) "ld_fbhit,ld_l1hit,ld_l2hit," "ld_lclhit,lcl_hitm," "ld_rmthit,rmt_hitm," - "dram_lcl,dram_rmt"; - else - output_str =3D "cl_idx," + "dram_lcl,dram_rmt", + c2c.show_mem_region ? + "dcacheline_mem_region," : "") < 0) { + err =3D -ENOMEM; + goto out_mem2node; + } + } else { + if (asprintf(&output_str, + "cl_idx," "dcacheline," + "%s" "dcacheline_node," "dcacheline_count," "percent_costly_snoop," @@ -3300,7 +3368,13 @@ static int perf_c2c__report(int argc, const char **a= rgv) "ld_fbhit,ld_l1hit,ld_l2hit," "ld_lclhit,lcl_hitm," "ld_rmthit,rmt_hitm," - "dram_lcl,dram_rmt"; + "dram_lcl,dram_rmt", + c2c.show_mem_region ? + "dcacheline_mem_region," : "") < 0) { + err =3D -ENOMEM; + goto out_mem2node; + } + } =20 if (c2c.display =3D=3D DISPLAY_TOT_HITM) sort_str =3D "tot_hitm"; @@ -3329,11 +3403,13 @@ static int perf_c2c__report(int argc, const char **= argv) =20 if (ui_quirks()) { pr_err("failed to setup UI\n"); - goto out_mem2node; + goto out_str; } =20 perf_c2c_display(session); =20 +out_str: + free(output_str); out_mem2node: mem2node__exit(&c2c.mem2node); out_session: diff --git a/tools/perf/util/c2c.h b/tools/perf/util/c2c.h index 53f024e25d99..f04e78e1a2e3 100644 --- a/tools/perf/util/c2c.h +++ b/tools/perf/util/c2c.h @@ -33,6 +33,7 @@ struct c2c_hist_entry { unsigned long *nodeset; struct c2c_stats *node_stats; unsigned int cacheline_idx; + unsigned int mem_region; =20 struct compute_stats cstats; =20 --=20 2.43.0 From nobody Sat Sep 26 13:47:23 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 9F51639769B; Mon, 31 Aug 2026 20:46:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209202; cv=none; b=Y/7VcKIVTefbrVIr6jb17GEOBmgtygdBDVrrwKDhtufOwE5eWn4XcVrMuEO7yYe4rXApgXIeXRDjFnznCxG8EDp2EB170EUWOamjFZH0WF23nfsvNP7C9K9CR7lyTjSFL+1czKx5sqToK96v30SOGR1VyXy9HPRKWpa42TpNgvc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209202; c=relaxed/simple; bh=Q4OanSXakhWj/ZM791M5Kl4SUcML/CQo3ST8ohckTUY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d6X0WcJ7ramT13HH2Fhx5zgveWkDD+ijoxGk3WQz1oyyt/gdf7DEGZkaQQHPsQn4vA9x2WGJihBlBu2bDZNXool+XAZckM38x9573sG8XjVqxzyGLthvlDp3Ge8CBhinSD+f7YkI+SQJ5e71RYcHoOfI8AI+PwRRUxyeAaL0sK8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=fA8g8iU0; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="fA8g8iU0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209200; x=1819745200; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Q4OanSXakhWj/ZM791M5Kl4SUcML/CQo3ST8ohckTUY=; b=fA8g8iU04DeT8QgrpU/1+OhsjZfXEMHES+jjFGHhKAXbhjpQBmyT4tA5 DeLJY5vEmFbbK+PWkKZoEtzyL4N2r7J4Dl0gX6Pm8y7bD/DErunLKFrt8 Pi0Ok+eP3MaoX7ukE2XaEc+EAgdh5g4WNeWTroD7Gu/ztIauoWVYo7ZnC oqwCDtmZ+yQ8Yu+rKauxq7ttGPXZ4mLXeqK9axkEfD9d6JfNEpcNKecKt yGepKBMVma0ZKu0tpkKWvrUtrVtoHLJFCPTgCSV0exzOtyLYUsE3peQvl jpV/j6kEEEUOUPfMg0OUfI2kfUKf7yPeGbodXaUfVR4q6nkj3tnW0Gp8g w==; X-CSE-ConnectionGUID: HHP+azhCQEaro1lWREJ0Tg== X-CSE-MsgGUID: b0kJtpCeR7+LJiO0F5AgrA== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147317" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147317" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:39 -0700 X-CSE-ConnectionGUID: bVnqrbGbTq+G38YwujKm5g== X-CSE-MsgGUID: rcxSfOT3S/SazAyJQ8Tz5g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268346043" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:38 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 5/6] perf tools: Show memory region in perf-script subcommand Date: Mon, 31 Aug 2026 15:46:12 -0500 Message-ID: <20260831204613.2793526-6-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Dapeng Mi Show the memory region in perf-script subcommand. Memory region is found in the mem_region field of the memory information data source. This field was included with the introduction of support for the Off-module Response facility (OMR) [1] in Intel's Diamond Rapids and Nova Lake Architectures. An example of perf-script output with the new memory region field is shown below: random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2ec random 2411a68201042 |OP LOAD|LVL RAM hit|SNP Hit|TLB L1 or L2 hit|LCK N= o|BLK N/A|Region Mem-1 561de7f8910a random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2d0 random 20e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK Data|Region N/A 7f32ae64a2d0 random 20e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK Data|Region N/A 7f32ae64a2d0 random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2ec random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2d0 random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2d0 random 2411a68201042 |OP LOAD|LVL RAM hit|SNP Hit|TLB L1 or L2 hit|LCK N= o|BLK N/A|Region Mem-1 561de7f8910a random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2ec random 10e6a100042 |OP LOAD|LVL L0 hit|SNP None|TLB L1 or L2 hit|LCK Y= es|BLK N/A|Region N/A 7f32ae64a2d0 [1]: https://lore.kernel.org/all/20260114011750.350569-1-dapeng1.mi@linux.i= ntel.com/ Assisted-by: Sashiko:gemini-3.1-pro-preview Assisted-by: GitHub-Copilot:claude-opus-4-8 Reviewed-by: Ian Rogers Signed-off-by: Dapeng Mi Signed-off-by: Thomas Falcon --- v4: Drop the global show-region flag; pass perf_session to perf_script__meminfo_scnprintf() and gate the Region field on the feature bit, with a pipe-mode fallback v3: make memory region reporting conditional on feature bit --- tools/perf/builtin-script.c | 13 +-- tools/perf/util/mem-events.c | 86 ++++++++++++++++++- tools/perf/util/mem-events.h | 4 +- .../scripting-engines/trace-event-python.c | 5 +- 4 files changed, 98 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index ad8ca08ceb5f..c7454155038d 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2078,11 +2078,12 @@ static int evlist__max_name_len(struct evlist *evli= st) return max; } =20 -static int data_src__fprintf(u64 data_src, FILE *fp) +static int data_src__fprintf(struct perf_session *session, + u64 data_src, FILE *fp) { struct mem_info *mi =3D mem_info__new(); - char decode[100]; - char out[100]; + char decode[200]; + char out[200]; static int maxlen; int len; =20 @@ -2090,10 +2091,10 @@ static int data_src__fprintf(u64 data_src, FILE *fp) return -ENOMEM; =20 mem_info__data_src(mi)->val =3D data_src; - perf_script__meminfo_scnprintf(decode, 100, mi); + perf_script__meminfo_scnprintf(decode, 200, mi, session); mem_info__put(mi); =20 - len =3D scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode); + len =3D scnprintf(out, 200, "%16" PRIx64 " %s", data_src, decode); if (maxlen < len) maxlen =3D len; =20 @@ -2487,7 +2488,7 @@ static void process_event(struct perf_script *script, perf_sample__fprintf_addr(sample, thread, evsel, fp); =20 if (PRINT_FIELD(DATA_SRC)) - data_src__fprintf(sample->data_src, fp); + data_src__fprintf(evsel__session(evsel), sample->data_src, fp); =20 if (PRINT_FIELD(WEIGHT)) fprintf(fp, "%16" PRIu64, sample->weight); diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c index 4fd48fd20055..8ce4996cad8d 100644 --- a/tools/perf/util/mem-events.c +++ b/tools/perf/util/mem-events.c @@ -604,8 +604,77 @@ int perf_mem__blk_scnprintf(char *out, size_t sz, cons= t struct mem_info *mem_inf return l; } =20 -int perf_script__meminfo_scnprintf(char *out, size_t sz, const struct mem_= info *mem_info) +static int perf_mem__region_scnprintf(char *out, size_t sz, const struct m= em_info *mem_info) { + size_t l =3D 0; + u64 mem =3D PERF_MEM_REGION_NA; + + sz -=3D 1; /* -1 for null termination */ + out[0] =3D '\0'; + + if (mem_info) + mem =3D mem_info__const_data_src(mem_info)->mem_region; + + switch (mem) { + case PERF_MEM_REGION_NA: + case PERF_MEM_REGION_RSVD: + l +=3D scnprintf(out + l, sz - l, "N/A"); + break; + case PERF_MEM_REGION_L_SHARE: + l +=3D scnprintf(out + l, sz - l, "Local-shared-cache"); + break; + case PERF_MEM_REGION_L_NON_SHARE: + l +=3D scnprintf(out + l, sz - l, "Local-non-shared-cache"); + break; + case PERF_MEM_REGION_O_IO: + l +=3D scnprintf(out + l, sz - l, "Other-IO"); + break; + case PERF_MEM_REGION_O_SHARE: + l +=3D scnprintf(out + l, sz - l, "Other-shared-cache"); + break; + case PERF_MEM_REGION_O_NON_SHARE: + l +=3D scnprintf(out + l, sz - l, "Other-non-shared-cache"); + break; + case PERF_MEM_REGION_MMIO: + l +=3D scnprintf(out + l, sz - l, "MMIO"); + break; + case PERF_MEM_REGION_MEM0: + l +=3D scnprintf(out + l, sz - l, "Mem-0"); + break; + case PERF_MEM_REGION_MEM1: + l +=3D scnprintf(out + l, sz - l, "Mem-1"); + break; + case PERF_MEM_REGION_MEM2: + l +=3D scnprintf(out + l, sz - l, "Mem-2"); + break; + case PERF_MEM_REGION_MEM3: + l +=3D scnprintf(out + l, sz - l, "Mem-3"); + break; + case PERF_MEM_REGION_MEM4: + l +=3D scnprintf(out + l, sz - l, "Mem-4"); + break; + case PERF_MEM_REGION_MEM5: + l +=3D scnprintf(out + l, sz - l, "Mem-5"); + break; + case PERF_MEM_REGION_MEM6: + l +=3D scnprintf(out + l, sz - l, "Mem-6"); + break; + case PERF_MEM_REGION_MEM7: + l +=3D scnprintf(out + l, sz - l, "Mem-7"); + break; + default: + l +=3D scnprintf(out + l, sz - l, "N/A"); + break; + } + + return l; +} + +int perf_script__meminfo_scnprintf(char *out, size_t sz, + const struct mem_info *mem_info, + struct perf_session *session) +{ + struct perf_env *env; int i =3D 0; =20 i +=3D scnprintf(out, sz, "|OP "); @@ -620,6 +689,21 @@ int perf_script__meminfo_scnprintf(char *out, size_t s= z, const struct mem_info * i +=3D perf_mem__lck_scnprintf(out + i, sz - i, mem_info); i +=3D scnprintf(out + i, sz - i, "|BLK "); i +=3D perf_mem__blk_scnprintf(out + i, sz - i, mem_info); + if (session) { + /* + * In case the feature bits are not available, as in + * pipe mode, fallback to checking for the existence of + * memory ranges + */ + env =3D perf_session__env(session); + if ((env && session->data->is_pipe && env->nr_memory_ranges) || + perf_header__has_feat(&session->header, + HEADER_MEMORY_RANGES)) { + i +=3D scnprintf(out + i, sz - i, "|Region "); + i +=3D perf_mem__region_scnprintf(out + i, sz - i, + mem_info); + } + } =20 return i; } diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h index daa22748f9fe..4ebb8109fc3c 100644 --- a/tools/perf/util/mem-events.h +++ b/tools/perf/util/mem-events.h @@ -4,6 +4,7 @@ =20 #include #include +#include "session.h" =20 struct perf_mem_event { bool supported; @@ -47,7 +48,8 @@ int perf_mem__snp_scnprintf(char *out, size_t sz, const s= truct mem_info *mem_inf int perf_mem__lck_scnprintf(char *out, size_t sz, const struct mem_info *m= em_info); int perf_mem__blk_scnprintf(char *out, size_t sz, const struct mem_info *m= em_info); =20 -int perf_script__meminfo_scnprintf(char *bf, size_t size, const struct mem= _info *mem_info); +int perf_script__meminfo_scnprintf(char *bf, size_t size, const struct mem= _info *mem_info, + struct perf_session *session); =20 struct c2c_stats { u32 nr_entries; diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 8f832ae316ca..e359fe529586 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -694,8 +694,9 @@ static void set_sample_read_in_dict(PyObject *dict_samp= le, struct perf_sample *s static void set_sample_datasrc_in_dict(PyObject *dict, struct perf_sample *sample) { + struct perf_session *session =3D evsel__session(sample->evsel); struct mem_info *mi =3D mem_info__new(); - char decode[100]; + char decode[200]; =20 if (!mi) Py_FatalError("couldn't create mem-info"); @@ -704,7 +705,7 @@ static void set_sample_datasrc_in_dict(PyObject *dict, PyLong_FromUnsignedLongLong(sample->data_src)); =20 mem_info__data_src(mi)->val =3D sample->data_src; - perf_script__meminfo_scnprintf(decode, 100, mi); + perf_script__meminfo_scnprintf(decode, 200, mi, session); mem_info__put(mi); =20 pydict_set_item_string_decref(dict, "datasrc_decode", --=20 2.43.0 From nobody Sat Sep 26 13:47:23 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 5A3BC3839B8; Mon, 31 Aug 2026 20:46:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209203; cv=none; b=aIwR9tyBJ6cXUNBowIOwbqW91cBxmxDS0MLEqN2liUvpJbPo33L+M2K1sbzX9usO6v14fCz5x1nr3U0qKnAWM98e6Pzzh9YLThW8uXW4g+TFkGYoyfMC++IqoXTU4KScvkQYBjvuSCs+ycp1ayNrXAUvA8fipQTDoIdovfcwy/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788209203; c=relaxed/simple; bh=SKyIGI+/c7WaxikI+kavIQjsJX93KrmQegyf3BWOd/c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JoWD1YK0e4eE8+C6TgcqR8vJxDucHsBVTmCEhEpeWiu2AsuKCCmN5AwBv+0nmrfdxEtV6AxF3VYvq6BPDlsqRvnrCMua0b1ySjjL3qvDs9ps1mI4bQNSJWfB7ckn4us5prre5tH+OCVY+qVbJE+VASyd+e5aCYkVYnQDKhOsqRc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=FQRb238z; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="FQRb238z" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788209201; x=1819745201; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=SKyIGI+/c7WaxikI+kavIQjsJX93KrmQegyf3BWOd/c=; b=FQRb238zB+oiNX0HcbytUu8Qh5xxhDYnKhQ5iYNe4SZXRb9mwQ9dVyUq NsPZ3w9j8tg9r0db/bBXFw/WThyFFlwAbBdopmmtFvoRDOzSGSwYpUXUe JigIM4IvnGIEs6POLh6U1HDsJ10sDz1+wL5k2ZPKAIXL9cIxcd0vpOOPE dOlaIcQx/lq1ZJNZg8FKMdoXShOV6EbJR2ydXhY6+AkbOM5OXXEcB0E0l 95Eyv36s4MwMgEEEMgXVk/cTx7uU9kYxyLuuihyYa4kBAdXKB7NijN5EU TMkPMuN9pd+1LuEGhQroQU/BFDkACq1vgv439ASsTP5yHKObO8T+RgV55 g==; X-CSE-ConnectionGUID: o6DasfNtTzmz897ruZp3qw== X-CSE-MsgGUID: qmJnu6ZhQJu37QHOq8YwUw== X-IronPort-AV: E=McAfee;i="6800,10657,11892"; a="106147334" X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="106147334" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:40 -0700 X-CSE-ConnectionGUID: /AebtKHlSXqqKwN4c7TbBg== X-CSE-MsgGUID: iybHK4w2RDCCoWFU+fEqOA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,254,1779174000"; d="scan'208";a="268346046" Received: from aschofie-mobl2.amr.corp.intel.com (HELO tfalcon-desk.intel.com) ([10.124.220.28]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2026 13:46:39 -0700 From: Thomas Falcon To: Namhyung Kim Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Dapeng Mi Subject: [PATCH v6 6/6] perf c2c: print memory region data with stdio output Date: Mon, 31 Aug 2026 15:46:13 -0500 Message-ID: <20260831204613.2793526-7-thomas.falcon@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260831204613.2793526-1-thomas.falcon@intel.com> References: <20260831204613.2793526-1-thomas.falcon@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Print memory range data in perf-c2c subcommand. Only available in stdio mode currently. If memory ranges are not supported or present, print nothing. Example output of perf c2c report --stdio: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Memory Ranges =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Range 0: [0x0000000000000000-0x00000000bfffffff] Node 0, local region id 0,= remote region id 255 Range 1: [0x0000000100000000-0x000000203fffffff] Node 0, local region id 0,= remote region id 255 Range 2: [0x0000008000000000-0x0000027fffffffff] Node -2, local region id 1= , remote region id 255 Range 3: [0x0000028000000000-0x0000047fffffffff] Node -2, local region id 1= , remote region id 255 Range 4: [0x0000048000000000-0x000004ffffffffff] Node -2, local region id 1= , remote region id 255 Assisted-by: Sashiko:gemini-3.1-pro-preview Reviewed-by: Ian Rogers Signed-off-by: Thomas Falcon --- v3: Included examples of memory range output in commit message --- tools/perf/builtin-c2c.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index c877b5056da0..da669136e545 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -2580,6 +2580,34 @@ static void print_c2c_info(FILE *out, struct perf_se= ssion *session) fprintf(out, " Cacheline data grouping : %s\n", c2c.cl_sort); } =20 + +static void print_memory_ranges_info(FILE *out, struct perf_session *sessi= on) +{ + struct perf_env *env =3D perf_session__env(session); + int nr_ranges =3D 0; + + if (!perf_header__has_feat(&session->header, HEADER_MEMORY_RANGES)) + return; + nr_ranges =3D env->nr_memory_ranges; + if (nr_ranges =3D=3D 0) { + pr_debug("No memory ranges found, skipping\n"); + return; + } + + fprintf(out, "\n"); + fprintf(out, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D\n"); + fprintf(out, " Memory Ranges \n"); + fprintf(out, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D\n"); + + for (int i =3D 0; i < nr_ranges; i++) { + struct memory_range *r =3D &env->memory_ranges[i]; + + fprintf(out, "Range %d: [0x%016" PRIx64 "-0x%016" PRIx64 "] Node %d, loc= al region id %u, remote region id %u\n", + i, r->base, r->base + r->length - 1, r->node, + r->local_region_id, r->remote_region_id); + } +} + static void perf_c2c__hists_fprintf(FILE *out, struct perf_session *sessio= n) { setup_pager(); @@ -2593,6 +2621,8 @@ static void perf_c2c__hists_fprintf(FILE *out, struct= perf_session *session) if (c2c.stats_only) return; =20 + print_memory_ranges_info(out, session); + fprintf(out, "\n"); fprintf(out, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D\n"); fprintf(out, " Shared Data Cache Line Table \n"); --=20 2.43.0