|
@@ -7081,20 +7081,26 @@ SYSCALL_DEFINE5(perf_event_open,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (task && group_leader &&
|
|
|
+ group_leader->attr.inherit != attr.inherit) {
|
|
|
+ err = -EINVAL;
|
|
|
+ goto err_task;
|
|
|
+ }
|
|
|
+
|
|
|
get_online_cpus();
|
|
|
|
|
|
event = perf_event_alloc(&attr, cpu, task, group_leader, NULL,
|
|
|
NULL, NULL);
|
|
|
if (IS_ERR(event)) {
|
|
|
err = PTR_ERR(event);
|
|
|
- goto err_task;
|
|
|
+ goto err_cpus;
|
|
|
}
|
|
|
|
|
|
if (flags & PERF_FLAG_PID_CGROUP) {
|
|
|
err = perf_cgroup_connect(pid, event, &attr, group_leader);
|
|
|
if (err) {
|
|
|
__free_event(event);
|
|
|
- goto err_task;
|
|
|
+ goto err_cpus;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -7256,8 +7262,9 @@ err_context:
|
|
|
put_ctx(ctx);
|
|
|
err_alloc:
|
|
|
free_event(event);
|
|
|
-err_task:
|
|
|
+err_cpus:
|
|
|
put_online_cpus();
|
|
|
+err_task:
|
|
|
if (task)
|
|
|
put_task_struct(task);
|
|
|
err_group_fd:
|