]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/x86/intel/uncore: Clean up func_id
authorKan Liang <kan.liang@linux.intel.com>
Wed, 8 Jan 2025 14:30:16 +0000 (06:30 -0800)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 10 Jan 2025 17:16:50 +0000 (18:16 +0100)
The below warning may be triggered on GNR when the PCIE uncore units are
exposed.

WARNING: CPU: 4 PID: 1 at arch/x86/events/intel/uncore.c:1169 uncore_pci_pmu_register+0x158/0x190

The current uncore driver assumes that all the devices in the same PMU
have the exact same devfn. It's true for the previous platforms. But it
doesn't work for the new PCIE uncore units on GNR.

The assumption doesn't make sense. There is no reason to limit the
devices from the same PMU to the same devfn. Also, the current code just
throws the warning, but still registers the device. The WARN_ON_ONCE()
should be removed.

The func_id is used by the later event_init() to check if a event->pmu
has valid devices. For cpu and mmio uncore PMUs, they are always valid.
For pci uncore PMUs, it's set when the PMU is registered. It can be
replaced by the pmu->registered. Clean up the func_id.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Eric Hu <eric.hu@intel.com>
Link: https://lkml.kernel.org/r/20250108143017.1793781-1-kan.liang@linux.intel.com
arch/x86/events/intel/uncore.c
arch/x86/events/intel/uncore.h
arch/x86/events/intel/uncore_snb.c

index d98fac56768469e051ee0be3932d4dbf01e34a3d..24372cf7fdfbbd9cacde2f7374124f12c34ed0be 100644 (file)
@@ -745,7 +745,7 @@ static int uncore_pmu_event_init(struct perf_event *event)
 
        pmu = uncore_event_to_pmu(event);
        /* no device found for this pmu */
-       if (pmu->func_id < 0)
+       if (!pmu->registered)
                return -ENOENT;
 
        /* Sampling not supported yet */
@@ -992,7 +992,7 @@ static void uncore_types_exit(struct intel_uncore_type **types)
                uncore_type_exit(*types);
 }
 
-static int __init uncore_type_init(struct intel_uncore_type *type, bool setid)
+static int __init uncore_type_init(struct intel_uncore_type *type)
 {
        struct intel_uncore_pmu *pmus;
        size_t size;
@@ -1005,7 +1005,6 @@ static int __init uncore_type_init(struct intel_uncore_type *type, bool setid)
        size = uncore_max_dies() * sizeof(struct intel_uncore_box *);
 
        for (i = 0; i < type->num_boxes; i++) {
-               pmus[i].func_id = setid ? i : -1;
                pmus[i].pmu_idx = i;
                pmus[i].type    = type;
                pmus[i].boxes   = kzalloc(size, GFP_KERNEL);
@@ -1055,12 +1054,12 @@ err:
 }
 
 static int __init
-uncore_types_init(struct intel_uncore_type **types, bool setid)
+uncore_types_init(struct intel_uncore_type **types)
 {
        int ret;
 
        for (; *types; types++) {
-               ret = uncore_type_init(*types, setid);
+               ret = uncore_type_init(*types);
                if (ret)
                        return ret;
        }
@@ -1160,11 +1159,6 @@ static int uncore_pci_pmu_register(struct pci_dev *pdev,
        if (!box)
                return -ENOMEM;
 
-       if (pmu->func_id < 0)
-               pmu->func_id = pdev->devfn;
-       else
-               WARN_ON_ONCE(pmu->func_id != pdev->devfn);
-
        atomic_inc(&box->refcnt);
        box->dieid = die;
        box->pci_dev = pdev;
@@ -1410,7 +1404,7 @@ static int __init uncore_pci_init(void)
                goto err;
        }
 
-       ret = uncore_types_init(uncore_pci_uncores, false);
+       ret = uncore_types_init(uncore_pci_uncores);
        if (ret)
                goto errtype;
 
@@ -1678,7 +1672,7 @@ static int __init uncore_cpu_init(void)
 {
        int ret;
 
-       ret = uncore_types_init(uncore_msr_uncores, true);
+       ret = uncore_types_init(uncore_msr_uncores);
        if (ret)
                goto err;
 
@@ -1697,7 +1691,7 @@ static int __init uncore_mmio_init(void)
        struct intel_uncore_type **types = uncore_mmio_uncores;
        int ret;
 
-       ret = uncore_types_init(types, true);
+       ret = uncore_types_init(types);
        if (ret)
                goto err;
 
index 79ff32e13dcc8127603c9bfac99e318d6ca24054..3dcb88c0ecfa33dec18b4e655bda1eefa34029eb 100644 (file)
@@ -125,7 +125,6 @@ struct intel_uncore_pmu {
        struct pmu                      pmu;
        char                            name[UNCORE_PMU_NAME_LEN];
        int                             pmu_idx;
-       int                             func_id;
        bool                            registered;
        atomic_t                        activeboxes;
        cpumask_t                       cpu_mask;
index 3934e1e4e3b166415e88892ed6819816570c9771..edb7fd50efe021ce5e065274b70578514c01e653 100644 (file)
@@ -910,7 +910,7 @@ static int snb_uncore_imc_event_init(struct perf_event *event)
 
        pmu = uncore_event_to_pmu(event);
        /* no device found for this pmu */
-       if (pmu->func_id < 0)
+       if (!pmu->registered)
                return -ENOENT;
 
        /* Sampling not supported yet */