From 6af5001ea05bf5f23c419dc6bed8917f6699139e Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 9 Jan 2009 16:26:43 +1100 Subject: [PATCH] --- yaml --- r: 147187 b: refs/heads/master c: 9abf8a08bc8f18a3b125f834f00e2e71b49c15d2 h: refs/heads/master i: 147185: 121ce175b653ce081fe73437a7ebe6abb9008071 147183: c1d81c39854976fde64a4fb057dd8cba12c25378 v: v3 --- [refs] | 2 +- trunk/kernel/perf_counter.c | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 23be37d44cfb..fb00fd79c943 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ff6f05416ece2caec1a7a1f8180d6598e0ab9272 +refs/heads/master: 9abf8a08bc8f18a3b125f834f00e2e71b49c15d2 diff --git a/trunk/kernel/perf_counter.c b/trunk/kernel/perf_counter.c index 4be1a8d872b4..b7a027a2ef02 100644 --- a/trunk/kernel/perf_counter.c +++ b/trunk/kernel/perf_counter.c @@ -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 = {