diff options
author | Al Viro <viro@ZenIV.linux.org.uk> | 2012-08-20 14:59:25 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-09-04 17:29:22 +0200 |
commit | a6fa941d94b411bbd2b6421ffbde6db3c93e65ab (patch) | |
tree | 2d80af531f906c6b27184148bbf15b8a7469c2a7 /include/linux/perf_event.h | |
parent | e3e45c01ae690e65f2650e5288b9af802e95a136 (diff) | |
download | lwn-a6fa941d94b411bbd2b6421ffbde6db3c93e65ab.tar.gz lwn-a6fa941d94b411bbd2b6421ffbde6db3c93e65ab.zip |
perf_event: Switch to internal refcount, fix race with close()
Don't mess with file refcounts (or keep a reference to file, for
that matter) in perf_event. Use explicit refcount of its own
instead. Deal with the race between the final reference to event
going away and new children getting created for it by use of
atomic_long_inc_not_zero() in inherit_event(); just have the
latter free what it had allocated and return NULL, that works
out just fine (children of siblings of something doomed are
created as singletons, same as if the child of leader had been
created and immediately killed).
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: stable@kernel.org
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20120820135925.GG23464@ZenIV.linux.org.uk
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/perf_event.h')
-rw-r--r-- | include/linux/perf_event.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 7602ccb3f40e..ad04dfcd6f35 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -926,7 +926,7 @@ struct perf_event { struct hw_perf_event hw; struct perf_event_context *ctx; - struct file *filp; + atomic_long_t refcount; /* * These accumulate total time (in nanoseconds) that children |