x86/aperfmperf: Store aperf/mperf data for cpu frequency reads
authorThomas Gleixner <tglx@linutronix.de>
Fri, 15 Apr 2022 19:20:01 +0000 (21:20 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 27 Apr 2022 18:22:19 +0000 (20:22 +0200)
Now that the MSR readout is unconditional, store the results in the per CPU
data structure along with a jiffies timestamp for the CPU frequency readout
code.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Paul E. McKenney <paulmck@kernel.org>
Link: https://lore.kernel.org/r/20220415161206.817702355@linutronix.de
arch/x86/kernel/cpu/aperfmperf.c

index df528a4f6de33059343d70072be87052e84018cc..963c0697a92be023430807706f35e76274a987f3 100644 (file)
 #include "cpu.h"
 
 struct aperfmperf {
+       seqcount_t      seq;
+       unsigned long   last_update;
+       u64             acnt;
+       u64             mcnt;
        u64             aperf;
        u64             mperf;
 };
 
-static DEFINE_PER_CPU_SHARED_ALIGNED(struct aperfmperf, cpu_samples);
+static DEFINE_PER_CPU_SHARED_ALIGNED(struct aperfmperf, cpu_samples) = {
+       .seq = SEQCNT_ZERO(cpu_samples.seq)
+};
 
 struct aperfmperf_sample {
        unsigned int    khz;
@@ -515,6 +521,12 @@ void arch_scale_freq_tick(void)
        s->aperf = aperf;
        s->mperf = mperf;
 
+       raw_write_seqcount_begin(&s->seq);
+       s->last_update = jiffies;
+       s->acnt = acnt;
+       s->mcnt = mcnt;
+       raw_write_seqcount_end(&s->seq);
+
        scale_freq_tick(acnt, mcnt);
 }