aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephane Eranian <eranian@google.com>2010-09-17 05:28:47 -0400
committerIngo Molnar <mingo@elte.hu>2010-09-17 06:48:47 -0400
commitd14b12d7adbf214f33eb59f800b5c3d5ed9268e8 (patch)
tree005705157545c70db6b751f38ae28702714fb1ed
parent74704ac6ea402d50c9543cb28247e6d9f521f7ae (diff)
perf_events: Fix broken event grouping
Events were not grouped anymore. The reason was that in perf_event_open(), the field event->group_leader was initialized before the function looked up the group_fd to find the event leader. This patch fixes this by reordering the code correctly. Signed-off-by: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Robert Richter <robert.richter@amd.com> LKML-Reference: <20100917093009.360420946@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/perf_event.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 86f394e15d53..ce95617f5d2c 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -5550,17 +5550,11 @@ SYSCALL_DEFINE5(perf_event_open,
5550 if (event_fd < 0) 5550 if (event_fd < 0)
5551 return event_fd; 5551 return event_fd;
5552 5552
5553 event = perf_event_alloc(&attr, cpu, group_leader, NULL, NULL);
5554 if (IS_ERR(event)) {
5555 err = PTR_ERR(event);
5556 goto err_fd;
5557 }
5558
5559 if (group_fd != -1) { 5553 if (group_fd != -1) {
5560 group_leader = perf_fget_light(group_fd, &fput_needed); 5554 group_leader = perf_fget_light(group_fd, &fput_needed);
5561 if (IS_ERR(group_leader)) { 5555 if (IS_ERR(group_leader)) {
5562 err = PTR_ERR(group_leader); 5556 err = PTR_ERR(group_leader);
5563 goto err_alloc; 5557 goto err_fd;
5564 } 5558 }
5565 group_file = group_leader->filp; 5559 group_file = group_leader->filp;
5566 if (flags & PERF_FLAG_FD_OUTPUT) 5560 if (flags & PERF_FLAG_FD_OUTPUT)
@@ -5569,6 +5563,12 @@ SYSCALL_DEFINE5(perf_event_open,
5569 group_leader = NULL; 5563 group_leader = NULL;
5570 } 5564 }
5571 5565
5566 event = perf_event_alloc(&attr, cpu, group_leader, NULL, NULL);
5567 if (IS_ERR(event)) {
5568 err = PTR_ERR(event);
5569 goto err_fd;
5570 }
5571
5572 /* 5572 /*
5573 * Special case software events and allow them to be part of 5573 * Special case software events and allow them to be part of
5574 * any hardware group. 5574 * any hardware group.
@@ -5653,7 +5653,6 @@ err_context:
5653 put_ctx(ctx); 5653 put_ctx(ctx);
5654err_group_fd: 5654err_group_fd:
5655 fput_light(group_file, fput_needed); 5655 fput_light(group_file, fput_needed);
5656err_alloc:
5657 free_event(event); 5656 free_event(event);
5658err_fd: 5657err_fd:
5659 put_unused_fd(event_fd); 5658 put_unused_fd(event_fd);