perf_counter: Accurate period data
We currently log hw.sample_period for PERF_SAMPLE_PERIOD, however this is incorrect. When we adjust the period, it will only take effect the next cycle but report it for the current cycle. So when we adjust the period for every cycle, we're always wrong. Solve this by keeping track of the last_period. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
df1a132bf3
commit
9e350de37a
@@ -767,6 +767,7 @@ static void power_pmu_unthrottle(struct perf_counter *counter)
|
||||
perf_disable();
|
||||
power_pmu_read(counter);
|
||||
left = counter->hw.sample_period;
|
||||
counter->hw.last_period = left;
|
||||
val = 0;
|
||||
if (left < 0x80000000L)
|
||||
val = 0x80000000L - left;
|
||||
@@ -937,7 +938,8 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter)
|
||||
|
||||
counter->hw.config = events[n];
|
||||
counter->hw.counter_base = cflags[n];
|
||||
atomic64_set(&counter->hw.period_left, counter->hw.sample_period);
|
||||
counter->hw.last_period = counter->hw.sample_period;
|
||||
atomic64_set(&counter->hw.period_left, counter->hw.last_period);
|
||||
|
||||
/*
|
||||
* See if we need to reserve the PMU.
|
||||
@@ -1002,8 +1004,9 @@ static void record_and_restart(struct perf_counter *counter, long val,
|
||||
*/
|
||||
if (record) {
|
||||
struct perf_sample_data data = {
|
||||
.regs = regs,
|
||||
.addr = 0,
|
||||
.regs = regs,
|
||||
.addr = 0,
|
||||
.period = counter->hw.last_period,
|
||||
};
|
||||
|
||||
if (counter->attr.sample_type & PERF_SAMPLE_ADDR) {
|
||||
|
Reference in New Issue
Block a user