diff options
author | Will Deacon <will.deacon@arm.com> | 2018-10-05 08:24:36 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2018-10-12 10:25:17 -0400 |
commit | ca2b497253ad01c80061a1f3ee9eb91b5d54a849 (patch) | |
tree | 06b96eee97a7f40173136b35f8b3ff945ae5925f /drivers/perf | |
parent | d91680e687f47984ffd3200c8e5d587903e7bd11 (diff) |
arm64: perf: Reject stand-alone CHAIN events for PMUv3
It doesn't make sense for a perf event to be configured as a CHAIN event
in isolation, so extend the arm_pmu structure with a ->filter_match()
function to allow the backend PMU implementation to reject CHAIN events
early.
Cc: <stable@vger.kernel.org>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'drivers/perf')
-rw-r--r-- | drivers/perf/arm_pmu.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 7f01f6f60b87..d0b7dd8fb184 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c | |||
@@ -485,7 +485,13 @@ static int armpmu_filter_match(struct perf_event *event) | |||
485 | { | 485 | { |
486 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); | 486 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); |
487 | unsigned int cpu = smp_processor_id(); | 487 | unsigned int cpu = smp_processor_id(); |
488 | return cpumask_test_cpu(cpu, &armpmu->supported_cpus); | 488 | int ret; |
489 | |||
490 | ret = cpumask_test_cpu(cpu, &armpmu->supported_cpus); | ||
491 | if (ret && armpmu->filter_match) | ||
492 | return armpmu->filter_match(event); | ||
493 | |||
494 | return ret; | ||
489 | } | 495 | } |
490 | 496 | ||
491 | static ssize_t armpmu_cpumask_show(struct device *dev, | 497 | static ssize_t armpmu_cpumask_show(struct device *dev, |