UPSTREAM: perf/core: Clean up perf_try_init_event()
Make sure that perf_try_init_event() doesn't leave event->pmu nor event->destroy set on failure. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Ravi Bangoria <ravi.bangoria@amd.com> Link: https://lore.kernel.org/r/20250205102449.110145835@infradead.org BUG: 426003784 (cherry picked from commit da02f54e81db2f7bf6af9d1d0cfc5b41ec6d0dcb) Change-Id: Ibbcf4e80ff58a44d4f234ed90fbf191b0432dc03 Signed-off-by: Aditya Chillara <quic_achillar@quicinc.com> Signed-off-by: Zhou Jian <quic_jianzhou@quicinc.com>
This commit is contained in:
committed by
Todd Kjos
parent
3f5de81785
commit
7d6f7afb0d
@@ -11965,40 +11965,51 @@ static int perf_try_init_event(struct pmu *pmu, struct perf_event *event)
|
||||
if (ctx)
|
||||
perf_event_ctx_unlock(event->group_leader, ctx);
|
||||
|
||||
if (!ret) {
|
||||
if (!(pmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS) &&
|
||||
has_extended_regs(event))
|
||||
ret = -EOPNOTSUPP;
|
||||
if (ret)
|
||||
goto err_pmu;
|
||||
|
||||
if (pmu->capabilities & PERF_PMU_CAP_NO_EXCLUDE &&
|
||||
event_has_any_exclude_flag(event))
|
||||
ret = -EINVAL;
|
||||
|
||||
if (pmu->scope != PERF_PMU_SCOPE_NONE && event->cpu >= 0) {
|
||||
const struct cpumask *cpumask = perf_scope_cpu_topology_cpumask(pmu->scope, event->cpu);
|
||||
struct cpumask *pmu_cpumask = perf_scope_cpumask(pmu->scope);
|
||||
int cpu;
|
||||
|
||||
if (pmu_cpumask && cpumask) {
|
||||
cpu = cpumask_any_and(pmu_cpumask, cpumask);
|
||||
if (cpu >= nr_cpu_ids)
|
||||
ret = -ENODEV;
|
||||
else
|
||||
event->event_caps |= PERF_EV_CAP_READ_SCOPE;
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret && event->destroy)
|
||||
event->destroy(event);
|
||||
if (!(pmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS) &&
|
||||
has_extended_regs(event)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto err_destroy;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
event->pmu = NULL;
|
||||
module_put(pmu->module);
|
||||
if (pmu->capabilities & PERF_PMU_CAP_NO_EXCLUDE &&
|
||||
event_has_any_exclude_flag(event)) {
|
||||
ret = -EINVAL;
|
||||
goto err_destroy;
|
||||
}
|
||||
|
||||
if (pmu->scope != PERF_PMU_SCOPE_NONE && event->cpu >= 0) {
|
||||
const struct cpumask *cpumask;
|
||||
struct cpumask *pmu_cpumask;
|
||||
int cpu;
|
||||
|
||||
cpumask = perf_scope_cpu_topology_cpumask(pmu->scope, event->cpu);
|
||||
pmu_cpumask = perf_scope_cpumask(pmu->scope);
|
||||
|
||||
ret = -ENODEV;
|
||||
if (!pmu_cpumask || !cpumask)
|
||||
goto err_destroy;
|
||||
|
||||
cpu = cpumask_any_and(pmu_cpumask, cpumask);
|
||||
if (cpu >= nr_cpu_ids)
|
||||
goto err_destroy;
|
||||
|
||||
event->event_caps |= PERF_EV_CAP_READ_SCOPE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_destroy:
|
||||
if (event->destroy) {
|
||||
event->destroy(event);
|
||||
event->destroy = NULL;
|
||||
}
|
||||
|
||||
err_pmu:
|
||||
event->pmu = NULL;
|
||||
module_put(pmu->module);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user