]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/x86/amd/uncore: Use Node ID to identify DF and UMC domains
authorSandipan Das <sandipan.das@amd.com>
Mon, 1 Jun 2026 12:13:05 +0000 (17:43 +0530)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 4 Jun 2026 09:38:38 +0000 (11:38 +0200)
For DF and UMC PMUs, a single context is shared across all CPUs that
are connected to the same Data Fabric (DF) instance. Currently, the
Package ID, which also happens to be the Socket ID, is used to identify
DF instances. This approach works for configurations having a single IO
Die (IOD) but fails in the following cases.
  * Older Zen 1 processors, where each chiplet has its own DF instance.
  * Any configurations with multiple DF instances or multiple IODs in
    the same package.

The correct way to identify DF instances is through the Node ID (not to
be confused with NUMA Node ID). This is available in ECX[7:0] of CPUID
leaf 0x8000001e and returned via topology_amd_node_id(). Hence, replace
usage of topology_logical_package_id() with topology_amd_node_id().

Fixes: 07888daa056e ("perf/x86/amd/uncore: Move discovery and registration")
Signed-off-by: Sandipan Das <sandipan.das@amd.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/e7a71a727c6a7b118c23d3e469929c538c4665aa.1780315832.git.sandipan.das@amd.com
arch/x86/events/amd/uncore.c

index dd956cfcadefade0a125ed48ff7916a0a6790b93..a0364ca2f917375a184e1bed70c3b3fc588211cc 100644 (file)
@@ -700,7 +700,7 @@ void amd_uncore_df_ctx_scan(struct amd_uncore *uncore, unsigned int cpu)
        info.split.aux_data = 0;
        info.split.num_pmcs = NUM_COUNTERS_NB;
        info.split.gid = 0;
-       info.split.cid = topology_logical_package_id(cpu);
+       info.split.cid = topology_amd_node_id(cpu);
 
        if (pmu_version >= 2) {
                ebx.full = cpuid_ebx(EXT_PERFMON_DEBUG_FEATURES);
@@ -999,8 +999,8 @@ void amd_uncore_umc_ctx_scan(struct amd_uncore *uncore, unsigned int cpu)
        cpuid(EXT_PERFMON_DEBUG_FEATURES, &eax, &ebx.full, &ecx, &edx);
        info.split.aux_data = ecx;      /* stash active mask */
        info.split.num_pmcs = ebx.split.num_umc_pmc;
-       info.split.gid = topology_logical_package_id(cpu);
-       info.split.cid = topology_logical_package_id(cpu);
+       info.split.gid = topology_amd_node_id(cpu);
+       info.split.cid = topology_amd_node_id(cpu);
        *per_cpu_ptr(uncore->info, cpu) = info;
 }