in kernel/perf_event_cpu.c [857:886]
static int nds32_pmu_event_init(struct perf_event *event)
{
struct nds32_pmu *nds32_pmu = to_nds32_pmu(event->pmu);
int err = 0;
atomic_t *active_events = &nds32_pmu->active_events;
/* does not support taken branch sampling */
if (has_branch_stack(event))
return -EOPNOTSUPP;
if (nds32_pmu->map_event(event) == -ENOENT)
return -ENOENT;
if (!atomic_inc_not_zero(active_events)) {
if (atomic_read(active_events) == 0) {
/* Register irq handler */
err = nds32_pmu_reserve_hardware(nds32_pmu);
}
if (!err)
atomic_inc(active_events);
}
if (err)
return err;
err = __hw_perf_event_init(event);
return err;
}