diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2010-05-27 17:47:49 +0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-05-31 10:46:09 +0400 |
commit | 8a49542c0554af7d0073aac0ee73ee65b807ef34 (patch) | |
tree | 73e82ee5a624012ac723c3af21bb1945b7bd675f /include/linux/perf_event.h | |
parent | ac9721f3f54b27a16c7e1afb2481e7ee95a70318 (diff) | |
download | linux-8a49542c0554af7d0073aac0ee73ee65b807ef34.tar.xz |
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/perf_event.h')
-rw-r--r-- | include/linux/perf_event.h | 4 |
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 { struct rcu_head rcu_head; }; +#define PERF_ATTACH_CONTEXT 0x01 +#define PERF_ATTACH_GROUP 0x02 + /** * struct perf_event - performance event kernel representation: */ @@ -646,6 +649,7 @@ struct perf_event { const struct pmu *pmu; enum perf_event_active_state state; + unsigned int attach_state; atomic64_t count; /* |