mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 18:23:53 +08:00
perf_counter: Fix the cpu_clock software counter
Impact: bug fix Currently if you do (e.g.) timec -e -1 ls, it will report 0 for the value of the cpu_clock counter. The reason is that the core assumes that a counter's count field is up-to-date when the counter is inactive, and doesn't call the counter's read function. However, the cpu_clock counter code only updates the count in the read function. This fixes it by making both the read and disable functions update the count. It also makes the counter ignore time passing while the counter is disabled, by making the enable function update the hw.prev_count field. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
ff6f05416e
commit
9abf8a08bc
@ -928,18 +928,32 @@ static const struct file_operations perf_fops = {
|
||||
|
||||
static int cpu_clock_perf_counter_enable(struct perf_counter *counter)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
|
||||
atomic64_set(&counter->hw.prev_count, cpu_clock(cpu));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cpu_clock_perf_counter_update(struct perf_counter *counter)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
s64 prev;
|
||||
u64 now;
|
||||
|
||||
now = cpu_clock(cpu);
|
||||
prev = atomic64_read(&counter->hw.prev_count);
|
||||
atomic64_set(&counter->hw.prev_count, now);
|
||||
atomic64_add(now - prev, &counter->count);
|
||||
}
|
||||
|
||||
static void cpu_clock_perf_counter_disable(struct perf_counter *counter)
|
||||
{
|
||||
cpu_clock_perf_counter_update(counter);
|
||||
}
|
||||
|
||||
static void cpu_clock_perf_counter_read(struct perf_counter *counter)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
|
||||
atomic64_set(&counter->count, cpu_clock(cpu));
|
||||
cpu_clock_perf_counter_update(counter);
|
||||
}
|
||||
|
||||
static const struct hw_perf_counter_ops perf_ops_cpu_clock = {
|
||||
|
Loading…
Reference in New Issue
Block a user