On Mon, Mar 23, 2020 at 04:58:46PM -0700, Ian Rogers wrote: SNIP > + /* no event */ > + if (*q == '\0') > + continue; > + > + memset(&attr, 0, sizeof(attr)); > + event_attr_init(&attr); > + > + ret = parse_libpfm_event(q, &attr); > + if (ret != PFM_SUCCESS) { > + fprintf(stderr, "failed to parse event %s : %s\n", str, pfm_strerror(ret)); > + goto error; > + } > + > + evsel = perf_evsel__new_idx(&attr, evlist->core.nr_entries); > + if (evsel == NULL) > + goto error; > + > + evsel->name = strdup(q); > + if (!evsel->name) { > + evsel__delete(evsel); > + goto error; > + } > + evsel->is_libpfm_event = true; > + > + pmu = perf_pmu__find_by_type((unsigned)attr.type); > + if (pmu) > + evsel->core.own_cpus = perf_cpu_map__get(pmu->cpus); I think you need to do more setup in here, like in __add_event function would be great to factor those bits from __add_event function and call it from here, so it's all in one place jirka