perf_counter: update mmap() counter read, take 2
Update the userspace read method. Paul noted that: - userspace cannot observe ->lock & 1 on the same cpu. - we need a barrier() between reading ->lock and ->index to ensure we read them in that prticular order. 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: <20090406094517.368446033@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
92f22a3865
commit
a2e87d06dd
@@ -170,13 +170,10 @@ struct perf_counter_mmap_page {
|
|||||||
* u32 seq;
|
* u32 seq;
|
||||||
* s64 count;
|
* s64 count;
|
||||||
*
|
*
|
||||||
* again:
|
* do {
|
||||||
* seq = pc->lock;
|
* seq = pc->lock;
|
||||||
* if (unlikely(seq & 1)) {
|
|
||||||
* cpu_relax();
|
|
||||||
* goto again;
|
|
||||||
* }
|
|
||||||
*
|
*
|
||||||
|
* barrier()
|
||||||
* if (pc->index) {
|
* if (pc->index) {
|
||||||
* count = pmc_read(pc->index - 1);
|
* count = pmc_read(pc->index - 1);
|
||||||
* count += pc->offset;
|
* count += pc->offset;
|
||||||
@@ -184,8 +181,7 @@ struct perf_counter_mmap_page {
|
|||||||
* goto regular_read;
|
* goto regular_read;
|
||||||
*
|
*
|
||||||
* barrier();
|
* barrier();
|
||||||
* if (pc->lock != seq)
|
* } while (pc->lock != seq);
|
||||||
* goto again;
|
|
||||||
*
|
*
|
||||||
* NOTE: for obvious reason this only works on self-monitoring
|
* NOTE: for obvious reason this only works on self-monitoring
|
||||||
* processes.
|
* processes.
|
||||||
|
Reference in New Issue
Block a user