mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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:
parent
92f22a3865
commit
a2e87d06dd
1 changed files with 10 additions and 14 deletions
|
@ -170,22 +170,18 @@ struct perf_counter_mmap_page {
|
|||
* u32 seq;
|
||||
* s64 count;
|
||||
*
|
||||
* again:
|
||||
* seq = pc->lock;
|
||||
* if (unlikely(seq & 1)) {
|
||||
* cpu_relax();
|
||||
* goto again;
|
||||
* }
|
||||
* do {
|
||||
* seq = pc->lock;
|
||||
*
|
||||
* if (pc->index) {
|
||||
* count = pmc_read(pc->index - 1);
|
||||
* count += pc->offset;
|
||||
* } else
|
||||
* goto regular_read;
|
||||
* barrier()
|
||||
* if (pc->index) {
|
||||
* count = pmc_read(pc->index - 1);
|
||||
* count += pc->offset;
|
||||
* } else
|
||||
* goto regular_read;
|
||||
*
|
||||
* barrier();
|
||||
* if (pc->lock != seq)
|
||||
* goto again;
|
||||
* barrier();
|
||||
* } while (pc->lock != seq);
|
||||
*
|
||||
* NOTE: for obvious reason this only works on self-monitoring
|
||||
* processes.
|
||||
|
|
Loading…
Reference in a new issue