perf/x86/intel/uncore: Store the logical die id instead of the physical die id.
authorSteve Wahl <steve.wahl@hpe.com>
Fri, 8 Jan 2021 15:35:48 +0000 (09:35 -0600)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 14 Jan 2021 10:20:13 +0000 (11:20 +0100)
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: Steve Wahl <steve.wahl@hpe.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
Link: https://lkml.kernel.org/r/20210108153549.108989-2-steve.wahl@hpe.com
arch/x86/events/intel/uncore.c
arch/x86/events/intel/uncore.h
arch/x86/events/intel/uncore_snb.c
arch/x86/events/intel/uncore_snbep.c

index 357258f..33c8180 100644 (file)
@@ -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 @@ lookup:
        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++;
index 9efea15..a3c6e16 100644 (file)
@@ -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);
index 098f893..5127128 100644 (file)
@@ -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);
index 7bdb182..2d7014d 100644 (file)
@@ -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;