in kernel/perf_event_cpu.c [1128:1170]
static int cpu_pmu_device_probe(struct platform_device *pdev)
{
const struct of_device_id *of_id;
int (*init_fn)(struct nds32_pmu *nds32_pmu);
struct device_node *node = pdev->dev.of_node;
struct nds32_pmu *pmu;
int ret = -ENODEV;
if (cpu_pmu) {
pr_notice("[perf] attempt to register multiple PMU devices!\n");
return -ENOSPC;
}
pmu = kzalloc(sizeof(*pmu), GFP_KERNEL);
if (!pmu)
return -ENOMEM;
of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node);
if (node && of_id) {
init_fn = of_id->data;
ret = init_fn(pmu);
} else {
ret = probe_current_pmu(pmu);
}
if (ret) {
pr_notice("[perf] failed to probe PMU!\n");
goto out_free;
}
cpu_pmu = pmu;
cpu_pmu->plat_device = pdev;
cpu_pmu_init(cpu_pmu);
ret = nds32_pmu_register(cpu_pmu, PERF_TYPE_RAW);
if (!ret)
return 0;
out_free:
pr_notice("[perf] failed to register PMU devices!\n");
kfree(pmu);
return ret;
}