perf_counter: fix race in perf_output_*
When two (or more) contexts output to the same buffer, it is possible to observe half written output. Suppose we have CPU0 doing perf_counter_mmap(), CPU1 doing perf_counter_overflow(). If CPU1 does a wakeup and exposes head to user-space, then CPU2 can observe the data CPU0 is still writing. [ Impact: fix occasionally corrupted profiling records ] Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> LKML-Reference: <20090501102533.007821627@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
3c56999eec
commit
c33a0bc4e4
@@ -358,10 +358,13 @@ struct perf_mmap_data {
|
||||
struct rcu_head rcu_head;
|
||||
int nr_pages; /* nr of data pages */
|
||||
|
||||
atomic_t wakeup; /* POLL_ for wakeups */
|
||||
atomic_t poll; /* POLL_ for wakeups */
|
||||
atomic_t head; /* write position */
|
||||
atomic_t events; /* event limit */
|
||||
|
||||
atomic_t wakeup_head; /* completed head */
|
||||
atomic_t lock; /* concurrent writes */
|
||||
|
||||
struct perf_counter_mmap_page *user_page;
|
||||
void *data_pages[0];
|
||||
};
|
||||
|
Reference in New Issue
Block a user