From: Qi Liu <liuqi...@huawei.com>

Add find_pmu_for_event() and use to simplify logic in
auxtrace_record_init(). find_pmu_for_event() will be
reused in subsequent patches.

Reviewed-by: Jonathan Cameron <jonathan.came...@huawei.com>
Signed-off-by: Qi Liu <liuqi...@huawei.com>
Signed-off-by: Yicong Yang <yangyic...@hisilicon.com>
---
 tools/perf/arch/arm/util/auxtrace.c | 53 ++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 19 deletions(-)

diff --git a/tools/perf/arch/arm/util/auxtrace.c 
b/tools/perf/arch/arm/util/auxtrace.c
index 5fc6a2a3dbc5..384c7cfda0fd 100644
--- a/tools/perf/arch/arm/util/auxtrace.c
+++ b/tools/perf/arch/arm/util/auxtrace.c
@@ -50,16 +50,32 @@ static struct perf_pmu **find_all_arm_spe_pmus(int 
*nr_spes, int *err)
        return arm_spe_pmus;
 }
 
+static struct perf_pmu *find_pmu_for_event(struct perf_pmu **pmus,
+                                          int pmu_nr, struct evsel *evsel)
+{
+       int i;
+
+       if (!pmus)
+               return NULL;
+
+       for (i = 0; i < pmu_nr; i++) {
+               if (evsel->core.attr.type == pmus[i]->type)
+                       return pmus[i];
+       }
+
+       return NULL;
+}
+
 struct auxtrace_record
 *auxtrace_record__init(struct evlist *evlist, int *err)
 {
-       struct perf_pmu *cs_etm_pmu;
+       struct perf_pmu *cs_etm_pmu = NULL;
+       struct perf_pmu **arm_spe_pmus = NULL;
        struct evsel *evsel;
-       bool found_etm = false;
+       struct perf_pmu *found_etm = NULL;
        struct perf_pmu *found_spe = NULL;
-       struct perf_pmu **arm_spe_pmus = NULL;
+       int auxtrace_event_cnt = 0;
        int nr_spes = 0;
-       int i = 0;
 
        if (!evlist)
                return NULL;
@@ -68,24 +84,23 @@ struct auxtrace_record
        arm_spe_pmus = find_all_arm_spe_pmus(&nr_spes, err);
 
        evlist__for_each_entry(evlist, evsel) {
-               if (cs_etm_pmu &&
-                   evsel->core.attr.type == cs_etm_pmu->type)
-                       found_etm = true;
-
-               if (!nr_spes || found_spe)
-                       continue;
-
-               for (i = 0; i < nr_spes; i++) {
-                       if (evsel->core.attr.type == arm_spe_pmus[i]->type) {
-                               found_spe = arm_spe_pmus[i];
-                               break;
-                       }
-               }
+               if (cs_etm_pmu && !found_etm)
+                       found_etm = find_pmu_for_event(&cs_etm_pmu, 1, evsel);
+
+               if (arm_spe_pmus && !found_spe)
+                       found_spe = find_pmu_for_event(arm_spe_pmus, nr_spes, 
evsel);
        }
+
        free(arm_spe_pmus);
 
-       if (found_etm && found_spe) {
-               pr_err("Concurrent ARM Coresight ETM and SPE operation not 
currently supported\n");
+       if (found_etm)
+               auxtrace_event_cnt++;
+
+       if (found_spe)
+               auxtrace_event_cnt++;
+
+       if (auxtrace_event_cnt > 1) {
+               pr_err("Concurrent AUX trace operation not currently 
supported\n");
                *err = -EOPNOTSUPP;
                return NULL;
        }
-- 
2.24.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to