x86/vmware: Read tsc_khz only once - at boot time
Subsystems (2)
PATCH 1/1 x86/vmware: Read tsc_khz only once - at boot time
Re-factor the vmware platform setup code to query the hypervisor for tsc frequency only once during boot. Since the VMware hypervisor guarantees constant TSC, calibrate_tsc now uses the saved value.
Signed-off-by Alexey Makhalov <[email protected]>
Acked-by Alok N Kataria <[email protected]>
--- arch/x86/kernel/cpu/vmware.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-)
arch/x86/kernel/cpu/vmware.c +18 -19
@@ -48,6 +48,8 @@ "2"(VMWARE_HYPERVISOR_PORT), "3"(UINT_MAX) : \ "memory"); +static unsigned long vmware_tsc_khz__ro_after_init ; +static inline int __vmware_platform (void ) {uint32_t eax, ebx, ecx, edx;
@@ -57,35 +59,32 @@ static inline int __vmware_platform(void)static unsigned long vmware_get_tsc_khz (void ) { -uint64_t tsc_hz, lpj; -uint32_t eax, ebx, ecx, edx; - -VMWARE_PORT (GETHZ , eax, ebx, ecx, edx); - - tsc_hz = eax | (((uint64_t )ebx) <<32 ); -do_div (tsc_hz,1000 ); -BUG_ON (tsc_hz >>32 ); -pr_info ("TSC freq read from hypervisor : %lu.%03lu MHz\n" , - (unsigned long ) tsc_hz /1000 , - (unsigned long ) tsc_hz %1000 ); - -if (!preset_lpj) { - lpj = ((u64 )tsc_hz *1000 ); -do_div (lpj,HZ ); - preset_lpj = lpj; - } - -return tsc_hz; +return vmware_tsc_khz; }static void __init vmware_platform_setup (void ) {uint32_t eax, ebx, ecx, edx; +uint64_t lpj, tsc_khz;VMWARE_PORT (GETHZ , eax, ebx, ecx, edx);if (ebx !=UINT_MAX ) { + lpj = tsc_khz = eax | (((uint64_t )ebx) <<32 ); +do_div (tsc_khz,1000 ); +WARN_ON (tsc_khz >>32 ); +pr_info ("TSC freq read from hypervisor : %lu.%03lu MHz\n" , + (unsigned long ) tsc_khz /1000 , + (unsigned long ) tsc_khz %1000 ); + +if (!preset_lpj) { +do_div (lpj,HZ ); + preset_lpj = lpj; + } + + vmware_tsc_khz = tsc_khz; x86_platform.calibrate_tsc = vmware_get_tsc_khz; +#ifdef CONFIG_X86_LOCAL_APIC /* Skip lapic calibration since we know the bus frequency. */ lapic_timer_frequency = ecx /HZ ;
Signature · 1 line
1.9.1
tip-bot for Alexey Makhalov
merge bot[tip:x86/platform] x86/vmware: Read tsc_khz only once at boot time
x86/vmware: Read tsc_khz only once at boot time
Commit-ID: cf11372949434fc4a6194b1ed9eb861d08032d08 Gitweb: http://git.kernel.org/tip/cf11372949434fc4a6194b1ed9eb861d08032d08 Author: Alexey Makhalov <[email protected]> AuthorDate: Wed, 19 Oct 2016 22:02:11 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 21 Oct 2016 10:12:11 +0200
x86/vmware: Read tsc_khz only once at boot time
Re-factor the vmware platform setup code to query the hypervisor for tsc frequency only once during boot. Since the VMware hypervisor guarantees constant TSC, calibrate_tsc now uses the saved value.
Signed-off-by Alexey Makhalov <[email protected]>
Acked-by Alok N Kataria <[email protected]>
Signed-off-by Thomas Gleixner <[email protected]>
--- arch/x86/kernel/cpu/vmware.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-)
arch/x86/kernel/cpu/vmware.c +18 -19
@@ -47,6 +47,8 @@ "2"(VMWARE_HYPERVISOR_PORT), "3"(UINT_MAX) : \ "memory"); +static unsigned long vmware_tsc_khz__ro_after_init ; +static inline int __vmware_platform (void ) {uint32_t eax, ebx, ecx, edx;
@@ -56,35 +58,32 @@ static inline int __vmware_platform(void)static unsigned long vmware_get_tsc_khz (void ) { -uint64_t tsc_hz, lpj; -uint32_t eax, ebx, ecx, edx; - -VMWARE_PORT (GETHZ , eax, ebx, ecx, edx); - - tsc_hz = eax | (((uint64_t )ebx) <<32 ); -do_div (tsc_hz,1000 ); -BUG_ON (tsc_hz >>32 ); -pr_info ("TSC freq read from hypervisor : %lu.%03lu MHz\n" , - (unsigned long ) tsc_hz /1000 , - (unsigned long ) tsc_hz %1000 ); - -if (!preset_lpj) { - lpj = ((u64 )tsc_hz *1000 ); -do_div (lpj,HZ ); - preset_lpj = lpj; - } - -return tsc_hz; +return vmware_tsc_khz; }static void __init vmware_platform_setup (void ) {uint32_t eax, ebx, ecx, edx; +uint64_t lpj, tsc_khz;VMWARE_PORT (GETHZ , eax, ebx, ecx, edx);if (ebx !=UINT_MAX ) { + lpj = tsc_khz = eax | (((uint64_t )ebx) <<32 ); +do_div (tsc_khz,1000 ); +WARN_ON (tsc_khz >>32 ); +pr_info ("TSC freq read from hypervisor : %lu.%03lu MHz\n" , + (unsigned long ) tsc_khz /1000 , + (unsigned long ) tsc_khz %1000 ); + +if (!preset_lpj) { +do_div (lpj,HZ ); + preset_lpj = lpj; + } + + vmware_tsc_khz = tsc_khz; x86_platform.calibrate_tsc = vmware_get_tsc_khz; +#ifdef CONFIG_X86_LOCAL_APIC /* Skip lapic calibration since we know the bus frequency. */ lapic_timer_frequency = ecx /HZ ;