> On Jan 27, 2019, at 6:53 AM, kan.liang@xxxxxxxxxxxxxxx wrote: > > From: Kan Liang <kan.liang@xxxxxxxxxxxxxxx> > > Some PCI uncore PMUs cannot be registered on a 8-socket system (HPE > Superdome Flex). > > To understand which Socket the PCI uncore PMUs belong to, perf retrieves > the local Node ID of the uncore device from CPUNODEID(0xC0) of the PCI > configuration space, and the mapping between Socket ID and Node ID from > GIDNIDMAP(0xD4). The Socket ID can be calculated accordingly. > The local Node ID is only available at bit 2:0, but current code doesn't > mask it. If a BIOS doesn't clear the rest of the bits, a wrong Node ID > will be fetched. > > Filter the Node ID by adding a mask. > > Fixes: 7c94ee2e0917 ("perf/x86: Add Intel Nehalem and Sandy Bridge-EP uncore support") > Reported-by: Song Liu <songliubraving@xxxxxx> > Tested-by: Song Liu <songliubraving@xxxxxx> > Signed-off-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx Thanks Kan! Acked-by: Song Liu <songliubraving@xxxxxx> > --- > arch/x86/events/intel/uncore_snbep.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c > index c07bee3..b10e043 100644 > --- a/arch/x86/events/intel/uncore_snbep.c > +++ b/arch/x86/events/intel/uncore_snbep.c > @@ -1222,6 +1222,8 @@ static struct pci_driver snbep_uncore_pci_driver = { > .id_table = snbep_uncore_pci_ids, > }; > > +#define NODE_ID_MASK 0x7 > + > /* > * build pci bus to socket mapping > */ > @@ -1243,7 +1245,7 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool > err = pci_read_config_dword(ubox_dev, nodeid_loc, &config); > if (err) > break; > - nodeid = config; > + nodeid = config & NODE_ID_MASK; > /* get the Node ID mapping */ > err = pci_read_config_dword(ubox_dev, idmap_loc, &config); > if (err) > -- > 2.7.4 >