Commit ba9506be authored by Steve Wahl's avatar Steve Wahl Committed by Peter Zijlstra
Browse files

perf/x86/intel/uncore: Store the logical die id instead of the physical die id.



The phys_id isn't really used other than to map to a logical die id.
Calculate the logical die id earlier, and store that instead of the
phys_id.

Signed-off-by: default avatarSteve Wahl <steve.wahl@hpe.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarKan Liang <kan.liang@linux.intel.com>
Link: https://lkml.kernel.org/r/20210108153549.108989-2-steve.wahl@hpe.com
parent e71ba945
Loading
Loading
Loading
Loading
+21 −37
Original line number Diff line number Diff line
@@ -31,21 +31,21 @@ struct event_constraint uncore_constraint_empty =

MODULE_LICENSE("GPL");

int uncore_pcibus_to_physid(struct pci_bus *bus)
int uncore_pcibus_to_dieid(struct pci_bus *bus)
{
	struct pci2phy_map *map;
	int phys_id = -1;
	int die_id = -1;

	raw_spin_lock(&pci2phy_map_lock);
	list_for_each_entry(map, &pci2phy_map_head, list) {
		if (map->segment == pci_domain_nr(bus)) {
			phys_id = map->pbus_to_physid[bus->number];
			die_id = map->pbus_to_dieid[bus->number];
			break;
		}
	}
	raw_spin_unlock(&pci2phy_map_lock);

	return phys_id;
	return die_id;
}

static void uncore_free_pcibus_map(void)
@@ -86,7 +86,7 @@ struct pci2phy_map *__find_pci2phy_map(int segment)
	alloc = NULL;
	map->segment = segment;
	for (i = 0; i < 256; i++)
		map->pbus_to_physid[i] = -1;
		map->pbus_to_dieid[i] = -1;
	list_add_tail(&map->list, &pci2phy_map_head);

end:
@@ -332,7 +332,6 @@ static struct intel_uncore_box *uncore_alloc_box(struct intel_uncore_type *type,

	uncore_pmu_init_hrtimer(box);
	box->cpu = -1;
	box->pci_phys_id = -1;
	box->dieid = -1;

	/* set default hrtimer timeout */
@@ -993,18 +992,11 @@ uncore_types_init(struct intel_uncore_type **types, bool setid)
/*
 * Get the die information of a PCI device.
 * @pdev: The PCI device.
 * @phys_id: The physical socket id which the device maps to.
 * @die: The die id which the device maps to.
 */
static int uncore_pci_get_dev_die_info(struct pci_dev *pdev,
				       int *phys_id, int *die)
static int uncore_pci_get_dev_die_info(struct pci_dev *pdev, int *die)
{
	*phys_id = uncore_pcibus_to_physid(pdev->bus);
	if (*phys_id < 0)
		return -ENODEV;

	*die = (topology_max_die_per_package() > 1) ? *phys_id :
				topology_phys_to_logical_pkg(*phys_id);
	*die = uncore_pcibus_to_dieid(pdev->bus);
	if (*die < 0)
		return -EINVAL;

@@ -1046,13 +1038,12 @@ uncore_pci_find_dev_pmu(struct pci_dev *pdev, const struct pci_device_id *ids)
 * @pdev: The PCI device.
 * @type: The corresponding PMU type of the device.
 * @pmu: The corresponding PMU of the device.
 * @phys_id: The physical socket id which the device maps to.
 * @die: The die id which the device maps to.
 */
static int uncore_pci_pmu_register(struct pci_dev *pdev,
				   struct intel_uncore_type *type,
				   struct intel_uncore_pmu *pmu,
				   int phys_id, int die)
				   int die)
{
	struct intel_uncore_box *box;
	int ret;
@@ -1070,7 +1061,6 @@ static int uncore_pci_pmu_register(struct pci_dev *pdev,
		WARN_ON_ONCE(pmu->func_id != pdev->devfn);

	atomic_inc(&box->refcnt);
	box->pci_phys_id = phys_id;
	box->dieid = die;
	box->pci_dev = pdev;
	box->pmu = pmu;
@@ -1097,9 +1087,9 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id
{
	struct intel_uncore_type *type;
	struct intel_uncore_pmu *pmu = NULL;
	int phys_id, die, ret;
	int die, ret;

	ret = uncore_pci_get_dev_die_info(pdev, &phys_id, &die);
	ret = uncore_pci_get_dev_die_info(pdev, &die);
	if (ret)
		return ret;

@@ -1132,7 +1122,7 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id
		pmu = &type->pmus[UNCORE_PCI_DEV_IDX(id->driver_data)];
	}

	ret = uncore_pci_pmu_register(pdev, type, pmu, phys_id, die);
	ret = uncore_pci_pmu_register(pdev, type, pmu, die);

	pci_set_drvdata(pdev, pmu->boxes[die]);

@@ -1142,17 +1132,12 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id
/*
 * Unregister the PMU of a PCI device
 * @pmu: The corresponding PMU is unregistered.
 * @phys_id: The physical socket id which the device maps to.
 * @die: The die id which the device maps to.
 */
static void uncore_pci_pmu_unregister(struct intel_uncore_pmu *pmu,
				      int phys_id, int die)
static void uncore_pci_pmu_unregister(struct intel_uncore_pmu *pmu, int die)
{
	struct intel_uncore_box *box = pmu->boxes[die];

	if (WARN_ON_ONCE(phys_id != box->pci_phys_id))
		return;

	pmu->boxes[die] = NULL;
	if (atomic_dec_return(&pmu->activeboxes) == 0)
		uncore_pmu_unregister(pmu);
@@ -1164,9 +1149,9 @@ static void uncore_pci_remove(struct pci_dev *pdev)
{
	struct intel_uncore_box *box;
	struct intel_uncore_pmu *pmu;
	int i, phys_id, die;
	int i, die;

	if (uncore_pci_get_dev_die_info(pdev, &phys_id, &die))
	if (uncore_pci_get_dev_die_info(pdev, &die))
		return;

	box = pci_get_drvdata(pdev);
@@ -1185,7 +1170,7 @@ static void uncore_pci_remove(struct pci_dev *pdev)

	pci_set_drvdata(pdev, NULL);

	uncore_pci_pmu_unregister(pmu, phys_id, die);
	uncore_pci_pmu_unregister(pmu, die);
}

static int uncore_bus_notify(struct notifier_block *nb,
@@ -1194,7 +1179,7 @@ static int uncore_bus_notify(struct notifier_block *nb,
	struct device *dev = data;
	struct pci_dev *pdev = to_pci_dev(dev);
	struct intel_uncore_pmu *pmu;
	int phys_id, die;
	int die;

	/* Unregister the PMU when the device is going to be deleted. */
	if (action != BUS_NOTIFY_DEL_DEVICE)
@@ -1204,10 +1189,10 @@ static int uncore_bus_notify(struct notifier_block *nb,
	if (!pmu)
		return NOTIFY_DONE;

	if (uncore_pci_get_dev_die_info(pdev, &phys_id, &die))
	if (uncore_pci_get_dev_die_info(pdev, &die))
		return NOTIFY_DONE;

	uncore_pci_pmu_unregister(pmu, phys_id, die);
	uncore_pci_pmu_unregister(pmu, die);

	return NOTIFY_OK;
}
@@ -1224,7 +1209,7 @@ static void uncore_pci_sub_driver_init(void)
	struct pci_dev *pci_sub_dev;
	bool notify = false;
	unsigned int devfn;
	int phys_id, die;
	int die;

	while (ids && ids->vendor) {
		pci_sub_dev = NULL;
@@ -1244,12 +1229,11 @@ static void uncore_pci_sub_driver_init(void)
			if (!pmu)
				continue;

			if (uncore_pci_get_dev_die_info(pci_sub_dev,
							&phys_id, &die))
			if (uncore_pci_get_dev_die_info(pci_sub_dev, &die))
				continue;

			if (!uncore_pci_pmu_register(pci_sub_dev, type, pmu,
						     phys_id, die))
						     die))
				notify = true;
		}
		ids++;
+2 −3
Original line number Diff line number Diff line
@@ -124,7 +124,6 @@ struct intel_uncore_extra_reg {
};

struct intel_uncore_box {
	int pci_phys_id;
	int dieid;	/* Logical die ID */
	int n_active;	/* number of active events */
	int n_events;
@@ -173,11 +172,11 @@ struct freerunning_counters {
struct pci2phy_map {
	struct list_head list;
	int segment;
	int pbus_to_physid[256];
	int pbus_to_dieid[256];
};

struct pci2phy_map *__find_pci2phy_map(int segment);
int uncore_pcibus_to_physid(struct pci_bus *bus);
int uncore_pcibus_to_dieid(struct pci_bus *bus);

ssize_t uncore_event_show(struct device *dev,
			  struct device_attribute *attr, char *buf);
+1 −1
Original line number Diff line number Diff line
@@ -657,7 +657,7 @@ int snb_pci2phy_map_init(int devid)
		pci_dev_put(dev);
		return -ENOMEM;
	}
	map->pbus_to_physid[bus] = 0;
	map->pbus_to_dieid[bus] = 0;
	raw_spin_unlock(&pci2phy_map_lock);

	pci_dev_put(dev);
+15 −16
Original line number Diff line number Diff line
@@ -1359,7 +1359,7 @@ static struct pci_driver snbep_uncore_pci_driver = {
static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool reverse)
{
	struct pci_dev *ubox_dev = NULL;
	int i, bus, nodeid, segment;
	int i, bus, nodeid, segment, die_id;
	struct pci2phy_map *map;
	int err = 0;
	u32 config = 0;
@@ -1395,7 +1395,11 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
		 */
		for (i = 0; i < 8; i++) {
			if (nodeid == ((config >> (3 * i)) & 0x7)) {
				map->pbus_to_physid[bus] = i;
				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;
			}
		}
@@ -1412,17 +1416,17 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
			i = -1;
			if (reverse) {
				for (bus = 255; bus >= 0; bus--) {
					if (map->pbus_to_physid[bus] >= 0)
						i = map->pbus_to_physid[bus];
					if (map->pbus_to_dieid[bus] >= 0)
						i = map->pbus_to_dieid[bus];
					else
						map->pbus_to_physid[bus] = i;
						map->pbus_to_dieid[bus] = i;
				}
			} else {
				for (bus = 0; bus <= 255; bus++) {
					if (map->pbus_to_physid[bus] >= 0)
						i = map->pbus_to_physid[bus];
					if (map->pbus_to_dieid[bus] >= 0)
						i = map->pbus_to_dieid[bus];
					else
						map->pbus_to_physid[bus] = i;
						map->pbus_to_dieid[bus] = i;
				}
			}
		}
@@ -4646,19 +4650,14 @@ int snr_uncore_pci_init(void)
static struct pci_dev *snr_uncore_get_mc_dev(int id)
{
	struct pci_dev *mc_dev = NULL;
	int phys_id, pkg;
	int pkg;

	while (1) {
		mc_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x3451, mc_dev);
		if (!mc_dev)
			break;
		phys_id = uncore_pcibus_to_physid(mc_dev->bus);
		if (phys_id < 0)
			continue;
		pkg = topology_phys_to_logical_pkg(phys_id);
		if (pkg < 0)
			continue;
		else if (pkg == id)
		pkg = uncore_pcibus_to_dieid(mc_dev->bus);
		if (pkg == id)
			break;
	}
	return mc_dev;