diff options
Diffstat (limited to 'kernel/events')
-rw-r--r-- | kernel/events/core.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 09866a330af8..1de0d709f69f 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -7081,20 +7081,26 @@ SYSCALL_DEFINE5(perf_event_open, | |||
7081 | } | 7081 | } |
7082 | } | 7082 | } |
7083 | 7083 | ||
7084 | if (task && group_leader && | ||
7085 | group_leader->attr.inherit != attr.inherit) { | ||
7086 | err = -EINVAL; | ||
7087 | goto err_task; | ||
7088 | } | ||
7089 | |||
7084 | get_online_cpus(); | 7090 | get_online_cpus(); |
7085 | 7091 | ||
7086 | event = perf_event_alloc(&attr, cpu, task, group_leader, NULL, | 7092 | event = perf_event_alloc(&attr, cpu, task, group_leader, NULL, |
7087 | NULL, NULL); | 7093 | NULL, NULL); |
7088 | if (IS_ERR(event)) { | 7094 | if (IS_ERR(event)) { |
7089 | err = PTR_ERR(event); | 7095 | err = PTR_ERR(event); |
7090 | goto err_task; | 7096 | goto err_cpus; |
7091 | } | 7097 | } |
7092 | 7098 | ||
7093 | if (flags & PERF_FLAG_PID_CGROUP) { | 7099 | if (flags & PERF_FLAG_PID_CGROUP) { |
7094 | err = perf_cgroup_connect(pid, event, &attr, group_leader); | 7100 | err = perf_cgroup_connect(pid, event, &attr, group_leader); |
7095 | if (err) { | 7101 | if (err) { |
7096 | __free_event(event); | 7102 | __free_event(event); |
7097 | goto err_task; | 7103 | goto err_cpus; |
7098 | } | 7104 | } |
7099 | } | 7105 | } |
7100 | 7106 | ||
@@ -7256,8 +7262,9 @@ err_context: | |||
7256 | put_ctx(ctx); | 7262 | put_ctx(ctx); |
7257 | err_alloc: | 7263 | err_alloc: |
7258 | free_event(event); | 7264 | free_event(event); |
7259 | err_task: | 7265 | err_cpus: |
7260 | put_online_cpus(); | 7266 | put_online_cpus(); |
7267 | err_task: | ||
7261 | if (task) | 7268 | if (task) |
7262 | put_task_struct(task); | 7269 | put_task_struct(task); |
7263 | err_group_fd: | 7270 | err_group_fd: |