aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2010-05-27 09:47:49 -0400
committerIngo Molnar <mingo@elte.hu>2010-05-31 02:46:09 -0400
commit8a49542c0554af7d0073aac0ee73ee65b807ef34 (patch)
tree73e82ee5a624012ac723c3af21bb1945b7bd675f /include/linux
parentac9721f3f54b27a16c7e1afb2481e7ee95a70318 (diff)
perf_events: Fix races in group composition
Group siblings don't pin each-other or the parent, so when we destroy events we must make sure to clean up all cross referencing pointers. In particular, for destruction of a group leader we must be able to find all its siblings and remove their reference to it. This means that detaching an event from its context must not detach it from the group, otherwise we can end up failing to clear all pointers. Solve this by clearly separating the attachment to a context and attachment to a group, and keep the group composed until we destroy the events. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/perf_event.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 490698590d6e..5d0266d94985 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -631,6 +631,9 @@ struct swevent_hlist {
631 struct rcu_head rcu_head; 631 struct rcu_head rcu_head;
632}; 632};
633 633
634#define PERF_ATTACH_CONTEXT 0x01
635#define PERF_ATTACH_GROUP 0x02
636
634/** 637/**
635 * struct perf_event - performance event kernel representation: 638 * struct perf_event - performance event kernel representation:
636 */ 639 */
@@ -646,6 +649,7 @@ struct perf_event {
646 const struct pmu *pmu; 649 const struct pmu *pmu;
647 650
648 enum perf_event_active_state state; 651 enum perf_event_active_state state;
652 unsigned int attach_state;
649 atomic64_t count; 653 atomic64_t count;
650 654
651 /* 655 /*