perf mem: Clean up perf_pmus__num_mem_pmus()
authorKan Liang <kan.liang@linux.intel.com>
Tue, 23 Jan 2024 18:50:36 +0000 (10:50 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 24 Jan 2024 22:05:22 +0000 (14:05 -0800)
The number of mem PMUs can be calculated by searching the
perf_pmus__scan_mem().

Remove the ARCH specific perf_pmus__num_mem_pmus()

Tested-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Cc: ravi.bangoria@amd.com
Cc: james.clark@arm.com
Cc: will@kernel.org
Cc: mike.leach@linaro.org
Cc: renyu.zj@linux.alibaba.com
Cc: yuhaixin.yhx@linux.alibaba.com
Cc: tmricht@linux.ibm.com
Cc: atrajeev@linux.vnet.ibm.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: john.g.garry@oracle.com
Link: https://lore.kernel.org/r/20240123185036.3461837-8-kan.liang@linux.intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/arch/x86/util/pmu.c
tools/perf/builtin-c2c.c
tools/perf/builtin-mem.c
tools/perf/util/mem-events.c
tools/perf/util/mem-events.h
tools/perf/util/pmus.c
tools/perf/util/pmus.h

index 0f49ff13cfe2808457aefb8dc0785d64ff778864..c3d89d6ba1bf03ad1b13d1a81ebdf3351b109392 100644 (file)
@@ -42,13 +42,3 @@ void perf_pmu__arch_init(struct perf_pmu *pmu __maybe_unused)
                        pmu->mem_events = perf_mem_events_intel;
        }
 }
-
-int perf_pmus__num_mem_pmus(void)
-{
-       /* AMD uses IBS OP pmu and not a core PMU for perf mem/c2c */
-       if (x86__is_amd_cpu())
-               return 1;
-
-       /* Intel uses core pmus for perf mem/c2c */
-       return perf_pmus__num_core_pmus();
-}
index 3bcb903b6b3886d5dade4462fa304fd2733db77a..16b40f5d43db06509c95db7b3747a4c52132aca0 100644 (file)
@@ -3278,7 +3278,7 @@ static int perf_c2c__record(int argc, const char **argv)
                             PARSE_OPT_KEEP_UNKNOWN);
 
        /* Max number of arguments multiplied by number of PMUs that can support them. */
-       rec_argc = argc + 11 * perf_pmus__num_mem_pmus();
+       rec_argc = argc + 11 * (perf_pmu__mem_events_num_mem_pmus(pmu) + 1);
 
        rec_argv = calloc(rec_argc + 1, sizeof(char *));
        if (!rec_argv)
index 1d92e309c97cdaab26411a0fb80f1d1494a1bc04..5b851e64e4a1afb4a04fc40753142befd23df62a 100644 (file)
@@ -106,7 +106,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
                             PARSE_OPT_KEEP_UNKNOWN);
 
        /* Max number of arguments multiplied by number of PMUs that can support them. */
-       rec_argc = argc + 9 * perf_pmus__num_mem_pmus();
+       rec_argc = argc + 9 * (perf_pmu__mem_events_num_mem_pmus(pmu) + 1);
 
        if (mem->cpu_list)
                rec_argc += 2;
index a20611b4fb1bc6d80bb2baa4140fc9fa22b0a4e2..637cbd4a7bfb45836513bd257c56ffcaab3540f1 100644 (file)
@@ -62,6 +62,20 @@ struct perf_pmu *perf_mem_events_find_pmu(void)
        return perf_pmus__scan_mem(NULL);
 }
 
+/**
+ * perf_pmu__mem_events_num_mem_pmus - Get the number of mem PMUs since the given pmu
+ * @pmu: Start pmu. If it's NULL, search the entire PMU list.
+ */
+int perf_pmu__mem_events_num_mem_pmus(struct perf_pmu *pmu)
+{
+       int num = 0;
+
+       while ((pmu = perf_pmus__scan_mem(pmu)) != NULL)
+               num++;
+
+       return num;
+}
+
 static const char *perf_pmu__mem_events_name(int i, struct perf_pmu *pmu)
 {
        struct perf_mem_event *e;
index c97cd3caa766c29d8e16eda27a1ac93e9619ba9b..15d5f0320d2779027c55fbe5eb2d0bf96b93744e 100644 (file)
@@ -43,6 +43,7 @@ int perf_pmu__mem_events_init(struct perf_pmu *pmu);
 
 struct perf_mem_event *perf_pmu__mem_events_ptr(struct perf_pmu *pmu, int i);
 struct perf_pmu *perf_mem_events_find_pmu(void);
+int perf_pmu__mem_events_num_mem_pmus(struct perf_pmu *pmu);
 bool is_mem_loads_aux_event(struct evsel *leader);
 
 void perf_pmu__mem_events_list(struct perf_pmu *pmu);
index ce4931461741d491de27757091ee096b5f8eb6f3..16505071d362f43e004867e1548fc73de2e84316 100644 (file)
@@ -345,12 +345,6 @@ const struct perf_pmu *perf_pmus__pmu_for_pmu_filter(const char *str)
        return NULL;
 }
 
-int __weak perf_pmus__num_mem_pmus(void)
-{
-       /* All core PMUs are for mem events. */
-       return perf_pmus__num_core_pmus();
-}
-
 /** Struct for ordering events as output in perf list. */
 struct sevent {
        /** PMU for event. */
index 4c67153ac257617290bde2d1c2c0412925f70e29..94d2a08d894b7d21411f04a662bd52f93ea65a3d 100644 (file)
@@ -17,7 +17,6 @@ struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu);
 
 const struct perf_pmu *perf_pmus__pmu_for_pmu_filter(const char *str);
 
-int perf_pmus__num_mem_pmus(void);
 void perf_pmus__print_pmu_events(const struct print_callbacks *print_cb, void *print_state);
 bool perf_pmus__have_event(const char *pname, const char *name);
 int perf_pmus__num_core_pmus(void);