Skip to content

Commit

Permalink
perf/x86/intel/uncore: Clean up func_id
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Kan Liang authored and Peter Zijlstra committed Jan 10, 2025
1 parent 0e45818 commit 3f710be
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 15 deletions.
20 changes: 7 additions & 13 deletions arch/x86/events/intel/uncore.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -1055,12 +1054,12 @@ static int __init uncore_type_init(struct intel_uncore_type *type, bool setid)
}

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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand All @@ -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;

Expand Down
1 change: 0 additions & 1 deletion arch/x86/events/intel/uncore.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/events/intel/uncore_snb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit 3f710be

Please sign in to comment.