Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

EDAC/mce_amd: Use struct cpuinfo_x86.cpu_die_id for AMD NodeId

The edac_mce_amd module calls decode_dram_ecc() on AMD Family17h and
later systems. This function is used in amd64_edac_mod to do
system-specific decoding for DRAM ECC errors. The function takes a
"NodeId" as a parameter.

In AMD documentation, NodeId is used to identify a physical die in a
system. This can be used to identify a node in the AMD_NB code and also
it is used with umc_normaddr_to_sysaddr().

However, the input used for decode_dram_ecc() is currently the NUMA node
of a logical CPU. In the default configuration, the NUMA node and
physical die will be equivalent, so this doesn't have an impact.

But the NUMA node configuration can be adjusted with optional memory
interleaving modes. This will cause the NUMA node enumeration to not
match the physical die enumeration. The mismatch will cause the address
translation function to fail or report incorrect results.

Use struct cpuinfo_x86.cpu_die_id for the node_id parameter to ensure the
physical ID is used.

Fixes: fbe63acf62f5 ("EDAC, mce_amd: Use cpu_to_node() to find the node ID")
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20201109210659.754018-4-Yazen.Ghannam@amd.com

authored by

Yazen Ghannam and committed by
Borislav Petkov
8de0c991 db970bd2

+1 -1
+1 -1
drivers/edac/mce_amd.c
··· 1003 1003 pr_cont(", %s.\n", smca_mce_descs[bank_type].descs[xec]); 1004 1004 1005 1005 if (bank_type == SMCA_UMC && xec == 0 && decode_dram_ecc) 1006 - decode_dram_ecc(cpu_to_node(m->extcpu), m); 1006 + decode_dram_ecc(topology_die_id(m->extcpu), m); 1007 1007 } 1008 1008 1009 1009 static inline void amd_decode_err_code(u16 ec)