case CPU_ONLINE_FROZEN:
pevent = perf_event_create_kernel_counter(attr,
cpu, NULL, overflow_callback);
- if (!pevent)
+ if (!pevent || IS_ERR(pevent))
return NOTIFY_BAD;
barrier(); /* Create perf counter before setting event */
events[cpu] = pevent;
ret = -ENOMEM;
goto append_context_error;
}
+ if (lttng_find_context(*ctx, name_alloc)) {
+ ret = -EEXIST;
+ goto find_error;
+ }
#ifdef CONFIG_HOTPLUG_CPU
field->u.perf_counter.nb.notifier_call =
for_each_online_cpu(cpu) {
events[cpu] = perf_event_create_kernel_counter(attr,
cpu, NULL, overflow_callback);
- if (!events[cpu]) {
+ if (!events[cpu] || IS_ERR(events[cpu])) {
ret = -EINVAL;
goto counter_error;
}
counter_error:
for_each_online_cpu(cpu) {
- if (events[cpu])
+ if (events[cpu] && !IS_ERR(events[cpu]))
perf_event_release_kernel(events[cpu]);
}
put_online_cpus();
#ifdef CONFIG_HOTPLUG_CPU
unregister_cpu_notifier(&field->u.perf_counter.nb);
#endif
+find_error:
lttng_remove_context_field(ctx, field);
append_context_error:
kfree(name_alloc);