diff options
author | Stratos Karafotis <stratosk@semaphore.gr> | 2014-07-18 11:37:24 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-07-21 07:43:18 -0400 |
commit | 4ab60c3f32c721e46217e762bcd3e55a8f659c04 (patch) | |
tree | 5edf608225d61bc595e99fe76c5521501dda1624 | |
parent | c410833a3c96b325c68987c2544becad39079c33 (diff) |
cpufreq: intel_pstate: Disable interrupts during MSRs reading
According to Intel 64 and IA-32 Architectures SDM, Volume 3,
Chapter 14.2, "Software needs to exercise care to avoid delays
between the two RDMSRs (for example interrupts)".
So, disable interrupts during reading MSRs IA32_APERF and IA32_MPERF.
This should increase the accuracy of the calculations.
Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr>
Signed-off-by: Dirk Brandewie <dirk.j.brandewie@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/cpufreq/intel_pstate.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 9d75bd6faf65..ff3c5624972c 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
@@ -577,9 +577,12 @@ static inline void intel_pstate_calc_busy(struct cpudata *cpu) | |||
577 | static inline void intel_pstate_sample(struct cpudata *cpu) | 577 | static inline void intel_pstate_sample(struct cpudata *cpu) |
578 | { | 578 | { |
579 | u64 aperf, mperf; | 579 | u64 aperf, mperf; |
580 | unsigned long flags; | ||
580 | 581 | ||
582 | local_irq_save(flags); | ||
581 | rdmsrl(MSR_IA32_APERF, aperf); | 583 | rdmsrl(MSR_IA32_APERF, aperf); |
582 | rdmsrl(MSR_IA32_MPERF, mperf); | 584 | rdmsrl(MSR_IA32_MPERF, mperf); |
585 | local_irq_restore(flags); | ||
583 | 586 | ||
584 | aperf = aperf >> FRAC_BITS; | 587 | aperf = aperf >> FRAC_BITS; |
585 | mperf = mperf >> FRAC_BITS; | 588 | mperf = mperf >> FRAC_BITS; |