diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2010-05-27 12:54:41 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-07-05 11:22:53 -0700 |
commit | 5842e8e202ecef054e6a769e194dbf9c17b81569 (patch) | |
tree | 6b8c8a83dad4ba05dd20d23765ef8f43219b156d /include | |
parent | ca2455ec0673fcde16f81ee0f585c4edc2e076e7 (diff) |
perf_events: Fix races and clean up perf_event and perf_mmap_data interaction
commit ac9721f3f54b27a16c7e1afb2481e7ee95a70318 upstream.
In order to move toward separate buffer objects, rework the whole
perf_mmap_data construct to be a more self-sufficient entity, one
with its own lifetime rules.
This greatly sanitizes the whole output redirection code, which
was riddled with bugs and races.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/perf_event.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index c8e37544040..eea91881fe2 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -531,6 +531,7 @@ enum perf_event_active_state { struct file; struct perf_mmap_data { + atomic_t refcount; struct rcu_head rcu_head; #ifdef CONFIG_PERF_USE_VMALLOC struct work_struct work; @@ -538,7 +539,6 @@ struct perf_mmap_data { int data_order; int nr_pages; /* nr of data pages */ int writable; /* are we writable */ - int nr_locked; /* nr pages mlocked */ atomic_t poll; /* POLL_ for wakeups */ atomic_t events; /* event_id limit */ @@ -582,7 +582,6 @@ struct perf_event { int nr_siblings; int group_flags; struct perf_event *group_leader; - struct perf_event *output; const struct pmu *pmu; enum perf_event_active_state state; @@ -643,6 +642,8 @@ struct perf_event { /* mmap bits */ struct mutex mmap_mutex; atomic_t mmap_count; + int mmap_locked; + struct user_struct *mmap_user; struct perf_mmap_data *data; /* poll related */ |