On Fri, Jan 08, 2021 at 09:35:49AM -0600, Steve Wahl wrote:
> + /* > + * The nodeid and idmap registers only contain enough > + * information to handle 8 nodes. On systems with more > + * than 8 nodes, we need to rely on NUMA information, > + * filled in from BIOS supplied information, to determine > + * the topology. > + */ Egads.. do we realy have to trust BIOS data? BIOS crud tends to be bonghits qualitee :/ > + if (nr_node_ids <= 8) { > + /* get the Node ID of the local register */ > + err = pci_read_config_dword(ubox_dev, nodeid_loc, > &config); > + if (err) > + break; > + nodeid = config & NODE_ID_MASK; > + /* get the Node ID mapping */ > + err = pci_read_config_dword(ubox_dev, idmap_loc, > &config); > + if (err) > + break; > > + segment = pci_domain_nr(ubox_dev->bus); > + raw_spin_lock(&pci2phy_map_lock); > + map = __find_pci2phy_map(segment); > + if (!map) { > + raw_spin_unlock(&pci2phy_map_lock); > + err = -ENOMEM; > + break; > + } > + > + /* > + * every three bits in the Node ID mapping register maps > + * to a particular node. > + */ > + for (i = 0; i < 8; i++) { > + if (nodeid == ((config >> (3 * i)) & 0x7)) { > + if (topology_max_die_per_package() > 1) > + die_id = i; > + else > + die_id = > topology_phys_to_logical_pkg(i); > + map->pbus_to_dieid[bus] = die_id; > + break; > + } > + } > raw_spin_unlock(&pci2phy_map_lock); > + } else { > + int node = pcibus_to_node(ubox_dev->bus); > + int cpu; > + > + segment = pci_domain_nr(ubox_dev->bus); > + raw_spin_lock(&pci2phy_map_lock); > + map = __find_pci2phy_map(segment); > + if (!map) { > + raw_spin_unlock(&pci2phy_map_lock); > + err = -ENOMEM; > + break; > + } > + die_id = -1; > + for_each_cpu(cpu, cpumask_of_pcibus(ubox_dev->bus)) { > + struct cpuinfo_x86 *c = &cpu_data(cpu); > + > + if (c->initialized && cpu_to_node(cpu) == node) > { > + map->pbus_to_dieid[bus] = die_id = > c->logical_die_id; > + break; > + } > + } > + raw_spin_unlock(&pci2phy_map_lock); > + > + if (WARN_ON_ONCE(die_id == -1)) { > + err = -EINVAL; > break; > } This seems to assume a single die per node; is that fundemantally correct? Did you consider malicious BIOS data? I think we're good, but I didn't look too hard. > } > } > > if (!err) { > -- > 2.26.2 >