bool init_attr,
            const char *name, const char *metric_id, struct perf_pmu *pmu,
            struct list_head *config_terms, bool auto_merge_stats,
-           const char *cpu_list)
+           struct perf_cpu_map *cpu_list)
 {
        struct evsel *evsel;
-       struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
-                              cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
+       struct perf_cpu_map *cpus = perf_cpu_map__is_empty(cpu_list) && pmu ? pmu->cpus : cpu_list;
 
+       cpus = perf_cpu_map__get(cpus);
        if (pmu)
                perf_pmu__warn_invalid_formats(pmu);
 
                .type = PERF_TYPE_SOFTWARE,
                .config = PERF_COUNT_SW_DUMMY,
        };
-       const char *cpu_list = NULL;
+       struct perf_cpu_map *cpu_list = NULL;
 
        if (tool_event == PERF_TOOL_DURATION_TIME) {
                /* Duration time is gathered globally, pretend it is only on CPU0. */
-               cpu_list = "0";
+               cpu_list = perf_cpu_map__new("0");
        }
        evsel = __add_event(list, idx, &attr, /*init_attr=*/true, /*name=*/NULL,
                            /*metric_id=*/NULL, /*pmu=*/NULL,
                            /*config_terms=*/NULL, /*auto_merge_stats=*/false,
                            cpu_list);
+       perf_cpu_map__put(cpu_list);
        if (!evsel)
                return -ENOMEM;
        evsel->tool_event = tool_event;