aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/perf_counter.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index f5e81dd193d1..1f81cde0dc43 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -850,17 +850,36 @@ static const struct hw_perf_counter_ops perf_ops_cpu_clock = {
850 .hw_perf_counter_read = cpu_clock_perf_counter_read, 850 .hw_perf_counter_read = cpu_clock_perf_counter_read,
851}; 851};
852 852
853static void task_clock_perf_counter_enable(struct perf_counter *counter) 853static void task_clock_perf_counter_update(struct perf_counter *counter)
854{ 854{
855 u64 prev, now;
856 s64 delta;
857
858 prev = atomic64_read(&counter->hw.prev_count);
859 now = current->se.sum_exec_runtime;
860
861 atomic64_set(&counter->hw.prev_count, now);
862
863 delta = now - prev;
864 if (WARN_ON_ONCE(delta < 0))
865 delta = 0;
866
867 atomic64_add(delta, &counter->count);
855} 868}
856 869
857static void task_clock_perf_counter_disable(struct perf_counter *counter) 870static void task_clock_perf_counter_read(struct perf_counter *counter)
858{ 871{
872 task_clock_perf_counter_update(counter);
859} 873}
860 874
861static void task_clock_perf_counter_read(struct perf_counter *counter) 875static void task_clock_perf_counter_enable(struct perf_counter *counter)
876{
877 atomic64_set(&counter->hw.prev_count, current->se.sum_exec_runtime);
878}
879
880static void task_clock_perf_counter_disable(struct perf_counter *counter)
862{ 881{
863 atomic64_set(&counter->count, current->se.sum_exec_runtime); 882 task_clock_perf_counter_update(counter);
864} 883}
865 884
866static const struct hw_perf_counter_ops perf_ops_task_clock = { 885static const struct hw_perf_counter_ops perf_ops_task_clock = {