Merge tag 'efi-fixes-for-v6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / tools / perf / builtin-mem.c
index 51499c2..5b851e6 100644 (file)
@@ -43,12 +43,19 @@ static int parse_record_events(const struct option *opt,
                               const char *str, int unset __maybe_unused)
 {
        struct perf_mem *mem = *(struct perf_mem **)opt->value;
+       struct perf_pmu *pmu;
+
+       pmu = perf_mem_events_find_pmu();
+       if (!pmu) {
+               pr_err("failed: there is no PMU that supports perf mem\n");
+               exit(-1);
+       }
 
        if (!strcmp(str, "list")) {
-               perf_mem_events__list();
+               perf_pmu__mem_events_list(pmu);
                exit(0);
        }
-       if (perf_mem_events__parse(str))
+       if (perf_pmu__mem_events_parse(pmu, str))
                exit(-1);
 
        mem->operation = 0;
@@ -65,13 +72,13 @@ static const char * const *record_mem_usage = __usage;
 
 static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 {
-       int rec_argc, i = 0, j, tmp_nr = 0;
+       int rec_argc, i = 0, j;
        int start, end;
        const char **rec_argv;
-       char **rec_tmp;
        int ret;
        bool all_user = false, all_kernel = false;
        struct perf_mem_event *e;
+       struct perf_pmu *pmu;
        struct option options[] = {
        OPT_CALLBACK('e', "event", &mem, "event",
                     "event selector. use 'perf mem record -e list' to list available events",
@@ -84,7 +91,13 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
        OPT_END()
        };
 
-       if (perf_mem_events__init()) {
+       pmu = perf_mem_events_find_pmu();
+       if (!pmu) {
+               pr_err("failed: no PMU supports the memory events\n");
+               return -1;
+       }
+
+       if (perf_pmu__mem_events_init(pmu)) {
                pr_err("failed: memory events not supported\n");
                return -1;
        }
@@ -93,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;
@@ -102,18 +115,9 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
        if (!rec_argv)
                return -1;
 
-       /*
-        * Save the allocated event name strings.
-        */
-       rec_tmp = calloc(rec_argc + 1, sizeof(char *));
-       if (!rec_tmp) {
-               free(rec_argv);
-               return -1;
-       }
-
        rec_argv[i++] = "record";
 
-       e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD_STORE);
+       e = perf_pmu__mem_events_ptr(pmu, PERF_MEM_EVENTS__LOAD_STORE);
 
        /*
         * The load and store operations are required, use the event
@@ -126,17 +130,17 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
                rec_argv[i++] = "-W";
        } else {
                if (mem->operation & MEM_OPERATION_LOAD) {
-                       e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD);
+                       e = perf_pmu__mem_events_ptr(pmu, PERF_MEM_EVENTS__LOAD);
                        e->record = true;
                }
 
                if (mem->operation & MEM_OPERATION_STORE) {
-                       e = perf_mem_events__ptr(PERF_MEM_EVENTS__STORE);
+                       e = perf_pmu__mem_events_ptr(pmu, PERF_MEM_EVENTS__STORE);
                        e->record = true;
                }
        }
 
-       e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD);
+       e = perf_pmu__mem_events_ptr(pmu, PERF_MEM_EVENTS__LOAD);
        if (e->record)
                rec_argv[i++] = "-W";
 
@@ -149,7 +153,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
                rec_argv[i++] = "--data-page-size";
 
        start = i;
-       ret = perf_mem_events__record_args(rec_argv, &i, rec_tmp, &tmp_nr);
+       ret = perf_mem_events__record_args(rec_argv, &i);
        if (ret)
                goto out;
        end = i;
@@ -179,10 +183,6 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
        ret = cmd_record(i, rec_argv);
 out:
-       for (i = 0; i < tmp_nr; i++)
-               free(rec_tmp[i]);
-
-       free(rec_tmp);
        free(rec_argv);
        return ret;
 }