linux/drivers/perf
Mark Rutland f14d29b891 perf: arm_pmu: Don't disable counter in armpmu_add()
[ Upstream commit dcca27bc1e ]

Currently armpmu_add() tries to handle a newly-allocated counter having
a stale associated event, but this should not be possible, and if this
were to happen the current mitigation is insufficient and potentially
expensive. It would be better to warn if we encounter the impossible
case.

Calls to pmu::add() and pmu::del() are serialized by the core perf code,
and armpmu_del() clears the relevant slot in pmu_hw_events::events[]
before clearing the bit in pmu_hw_events::used_mask such that the
counter can be reallocated. Thus when armpmu_add() allocates a counter
index from pmu_hw_events::used_mask, it should not be possible to observe
a stale even in pmu_hw_events::events[] unless either
pmu_hw_events::used_mask or pmu_hw_events::events[] have been corrupted.

If this were to happen, we'd end up with two events with the same
event->hw.idx, which would clash with each other during reprogramming,
deletion, etc, and produce bogus results. Add a WARN_ON_ONCE() for this
case so that we can detect if this ever occurs in practice.

That possiblity aside, there's no need to call arm_pmu::disable(event)
for the new event. The PMU reset code initialises the counter in a
disabled state, and armpmu_del() will disable the counter before it can
be reused. Remove the redundant disable.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Tested-by: James Clark <james.clark@linaro.org>
Link: https://lore.kernel.org/r/20250218-arm-brbe-v19-v20-2-4e9922fc2e8e@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-04-25 10:45:10 +02:00
..
amlogic drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
arm_cspmu perf: arm_cspmu: Reject events meant for other PMUs 2023-11-28 17:19:54 +00:00
hisilicon drivers/perf: hisi_pcie: Fix TLP headers bandwidth counting 2024-10-04 16:28:53 +02:00
alibaba_uncore_drw_pmu.c drivers/perf: Fix ali_drw_pmu driver interrupt status clearing 2024-10-04 16:28:51 +02:00
apple_m1_cpu_pmu.c drivers/perf: apple_m1: Force 63bit counters for M2 CPUs 2023-06-05 15:39:59 +01:00
arm-cci.c drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
arm-ccn.c drivers/perf:Directly use ida_alloc()/free() 2022-06-23 15:44:45 +01:00
arm-cmn.c perf/arm-cmn: Ensure port and device id bits are set properly 2024-12-09 10:32:57 +01:00
arm_dmc620_pmu.c perf/arm-dmc620: Fix lockdep assert in ->event_init() 2024-06-12 11:12:46 +02:00
arm_dsu_pmu.c drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
arm_pmu.c perf: arm_pmu: Don't disable counter in armpmu_add() 2025-04-25 10:45:10 +02:00
arm_pmu_acpi.c arm_pmu: acpi: Add a representative platform device for TRBE 2023-08-18 18:07:10 +01:00
arm_pmu_platform.c drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
arm_pmuv3.c drivers/perf: pmuv3: don't expose SW_INCR event in sysfs 2024-02-05 20:14:14 +00:00
arm_smmuv3_pmu.c perf/arm-smmuv3: Fix lockdep assert in ->event_init() 2024-12-09 10:32:57 +01:00
arm_spe_pmu.c drivers/perf: arm_spe: Use perf_allow_kernel() for permissions 2024-10-10 11:57:27 +02:00
cxl_pmu.c perf: CXL: fix CPMU filter value mask length 2024-03-26 18:19:12 -04:00
fsl_imx8_ddr_perf.c perf/imx_ddr: don't enable counter0 if none of 4 counters are used 2023-08-16 14:34:51 +01:00
fsl_imx9_ddr_perf.c perf: imx_perf: fix counter start and config sequence 2024-08-11 12:47:17 +02:00
Kconfig perf/smmuv3: Remove build dependency on ACPI 2023-07-27 13:00:49 +01:00
Makefile cxl for v6.5 2023-07-01 08:58:41 -07:00
marvell_cn10k_ddr_pmu.c drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
marvell_cn10k_tad_pmu.c drivers/perf: Explicitly include correct DT includes 2023-07-27 13:02:23 +01:00
qcom_l2_pmu.c perf: qcom_l2_pmu: Make l2_cache_pmu_probe_cluster() more robust 2023-06-05 15:01:27 +01:00
qcom_l3_pmu.c perf: qcom: Use devm_platform_get_and_ioremap_resource() 2023-03-27 15:03:01 +01:00
riscv_pmu.c drivers/perf: riscv: Disable PERF_SAMPLE_BRANCH_* while not supported 2024-04-10 16:35:58 +02:00
riscv_pmu_legacy.c drivers: perf: ctr_get_width function for legacy is not defined 2024-03-06 14:48:38 +00:00
riscv_pmu_sbi.c perf: riscv: Fix selecting counters in legacy mode 2024-08-11 12:47:23 +02:00
thunderx2_pmu.c perf: Replace acpi_bus_get_device() 2022-02-08 15:14:53 +00:00
xgene_pmu.c perf: xgene_pmu: Convert to devm_platform_ioremap_resource() 2023-07-27 13:00:10 +01:00