perf/x86/intel/uncore: Factor out uncore_pci_find_dev_pmu()
authorKan Liang <kan.liang@linux.intel.com>
Mon, 14 Sep 2020 14:34:16 +0000 (07:34 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 24 Sep 2020 13:55:50 +0000 (15:55 +0200)
When an uncore PCI sub driver gets a remove notification, the
corresponding PMU has to be retrieved and unregistered. The codes, which
find the corresponding PMU by comparing the pci_device_id table, can be
shared.

Factor out uncore_pci_find_dev_pmu(), which will be used later.

There is no functional change.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/1600094060-82746-3-git-send-email-kan.liang@linux.intel.com
arch/x86/events/intel/uncore.c

index e14b03f9994908506f273113fe6aa0534ce2de8a..f6ff1b979c19670d57e5445a6438c894392ae36b 100644 (file)
@@ -1008,6 +1008,37 @@ static int uncore_pci_get_dev_die_info(struct pci_dev *pdev,
 
        return 0;
 }
+
+/*
+ * Find the PMU of a PCI device.
+ * @pdev: The PCI device.
+ * @ids: The ID table of the available PCI devices with a PMU.
+ */
+static struct intel_uncore_pmu *
+uncore_pci_find_dev_pmu(struct pci_dev *pdev, const struct pci_device_id *ids)
+{
+       struct intel_uncore_pmu *pmu = NULL;
+       struct intel_uncore_type *type;
+       kernel_ulong_t data;
+       unsigned int devfn;
+
+       while (ids && ids->vendor) {
+               if ((ids->vendor == pdev->vendor) &&
+                   (ids->device == pdev->device)) {
+                       data = ids->driver_data;
+                       devfn = PCI_DEVFN(UNCORE_PCI_DEV_DEV(data),
+                                         UNCORE_PCI_DEV_FUNC(data));
+                       if (devfn == pdev->devfn) {
+                               type = uncore_pci_uncores[UNCORE_PCI_DEV_TYPE(data)];
+                               pmu = &type->pmus[UNCORE_PCI_DEV_IDX(data)];
+                               break;
+                       }
+               }
+               ids++;
+       }
+       return pmu;
+}
+
 /*
  * add a pci uncore device
  */
@@ -1039,21 +1070,8 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id
         */
        if (id->driver_data & ~0xffff) {
                struct pci_driver *pci_drv = pdev->driver;
-               const struct pci_device_id *ids = pci_drv->id_table;
-               unsigned int devfn;
-
-               while (ids && ids->vendor) {
-                       if ((ids->vendor == pdev->vendor) &&
-                           (ids->device == pdev->device)) {
-                               devfn = PCI_DEVFN(UNCORE_PCI_DEV_DEV(ids->driver_data),
-                                                 UNCORE_PCI_DEV_FUNC(ids->driver_data));
-                               if (devfn == pdev->devfn) {
-                                       pmu = &type->pmus[UNCORE_PCI_DEV_IDX(ids->driver_data)];
-                                       break;
-                               }
-                       }
-                       ids++;
-               }
+
+               pmu = uncore_pci_find_dev_pmu(pdev, pci_drv->id_table);
                if (pmu == NULL)
                        return -ENODEV;
        } else {