All of these drivers copy a pattern of actively policing cross-PMU
groups, which is redundant since commit bf480f938566 ("perf/core: Don't
allow grouping events from different hw pmus"). Clean up these checks to
simplfy matters, especially for thunderx2 which can reduce right down to
trivial counting.

Signed-off-by: Robin Murphy <robin.mur...@arm.com>
---
 drivers/perf/arm_cspmu/arm_cspmu.c |  7 ++-----
 drivers/perf/arm_dsu_pmu.c         |  6 ++----
 drivers/perf/arm_pmu.c             | 11 ++---------
 drivers/perf/thunderx2_pmu.c       | 30 +++++++-----------------------
 4 files changed, 13 insertions(+), 41 deletions(-)

diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c 
b/drivers/perf/arm_cspmu/arm_cspmu.c
index efa9b229e701..7f5ea749b85c 100644
--- a/drivers/perf/arm_cspmu/arm_cspmu.c
+++ b/drivers/perf/arm_cspmu/arm_cspmu.c
@@ -561,12 +561,9 @@ static bool arm_cspmu_validate_event(struct pmu *pmu,
                                 struct arm_cspmu_hw_events *hw_events,
                                 struct perf_event *event)
 {
-       if (is_software_event(event))
-               return true;
-
-       /* Reject groups spanning multiple HW PMUs. */
+       /* Ignore grouped events that aren't ours */
        if (event->pmu != pmu)
-               return false;
+               return true;
 
        return (arm_cspmu_get_event_idx(hw_events, event) >= 0);
 }
diff --git a/drivers/perf/arm_dsu_pmu.c b/drivers/perf/arm_dsu_pmu.c
index cb4fb59fe04b..7480fd6fe377 100644
--- a/drivers/perf/arm_dsu_pmu.c
+++ b/drivers/perf/arm_dsu_pmu.c
@@ -492,11 +492,9 @@ static bool dsu_pmu_validate_event(struct pmu *pmu,
                                  struct dsu_hw_events *hw_events,
                                  struct perf_event *event)
 {
-       if (is_software_event(event))
-               return true;
-       /* Reject groups spanning multiple HW PMUs. */
+       /* Ignore grouped events that aren't ours */
        if (event->pmu != pmu)
-               return false;
+               return true;
        return dsu_pmu_get_event_idx(hw_events, event) >= 0;
 }
 
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index e8a3c8e99da0..2c1af3a0207c 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -375,16 +375,9 @@ validate_event(struct pmu *pmu, struct pmu_hw_events 
*hw_events,
 {
        struct arm_pmu *armpmu;
 
-       if (is_software_event(event))
-               return 1;
-
-       /*
-        * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The
-        * core perf code won't check that the pmu->ctx == leader->ctx
-        * until after pmu->event_init(event).
-        */
+       /* Ignore grouped events that aren't ours */
        if (event->pmu != pmu)
-               return 0;
+               return 1;
 
        armpmu = to_arm_pmu(event->pmu);
        return armpmu->get_event_idx(hw_events, event) >= 0;
diff --git a/drivers/perf/thunderx2_pmu.c b/drivers/perf/thunderx2_pmu.c
index 6ed4707bd6bb..472eb4494fd1 100644
--- a/drivers/perf/thunderx2_pmu.c
+++ b/drivers/perf/thunderx2_pmu.c
@@ -519,19 +519,6 @@ static enum tx2_uncore_type get_tx2_pmu_type(struct 
acpi_device *adev)
        return (enum tx2_uncore_type)id->driver_data;
 }
 
-static bool tx2_uncore_validate_event(struct pmu *pmu,
-                                 struct perf_event *event, int *counters)
-{
-       if (is_software_event(event))
-               return true;
-       /* Reject groups spanning multiple HW PMUs. */
-       if (event->pmu != pmu)
-               return false;
-
-       *counters = *counters + 1;
-       return true;
-}
-
 /*
  * Make sure the group of events can be scheduled at once
  * on the PMU.
@@ -539,23 +526,20 @@ static bool tx2_uncore_validate_event(struct pmu *pmu,
 static bool tx2_uncore_validate_event_group(struct perf_event *event,
                int max_counters)
 {
-       struct perf_event *sibling, *leader = event->group_leader;
-       int counters = 0;
+       struct perf_event *sibling;
+       int counters = 1;
 
        if (event->group_leader == event)
                return true;
 
-       if (!tx2_uncore_validate_event(event->pmu, leader, &counters))
-               return false;
+       if (event->group_leader->pmu == event->pmu)
+               ++counters;
 
-       for_each_sibling_event(sibling, leader) {
-               if (!tx2_uncore_validate_event(event->pmu, sibling, &counters))
-                       return false;
+       for_each_sibling_event(sibling, event->group_leader) {
+               if (sibling->pmu == event->pmu)
+                       ++counters;
        }
 
-       if (!tx2_uncore_validate_event(event->pmu, event, &counters))
-               return false;
-
        /*
         * If the group requires more counters than the HW has,
         * it cannot ever be scheduled.
-- 
2.39.2.101.g768bb238c484.dirty


Reply via email to