]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86, vmware: Preset lpj values when on VMware.
authorAlok Kataria <akataria@vmware.com>
Mon, 2 Aug 2010 23:10:37 +0000 (16:10 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 13 Aug 2010 20:27:10 +0000 (13:27 -0700)
commit 9f242dc10e0c3c1eb32d8c83c18650a35fd7f80d upstream.

When running on VMware's platform, we have seen situations where
the AP's try to calibrate the lpj values and fail to get good calibration
runs becasue of timing issues. As a result delays don't work correctly
on all cpus.

The solutions is to set preset_lpj value based on the current tsc frequency
value. This is similar to what KVM does as well.

Signed-off-by: Alok N Kataria <akataria@vmware.com>
LKML-Reference: <1280790637.14933.29.camel@ank32.eng.vmware.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/cpu/vmware.c

index dfdb4dba23201e2507949d7b7a9ffeabc53e7961..562d5f04cc9653b654190ee60266d6ea4e66243c 100644 (file)
@@ -51,7 +51,7 @@ static inline int __vmware_platform(void)
 
 static unsigned long vmware_get_tsc_khz(void)
 {
-       uint64_t tsc_hz;
+       uint64_t tsc_hz, lpj;
        uint32_t eax, ebx, ecx, edx;
 
        VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);
@@ -62,6 +62,13 @@ static unsigned long vmware_get_tsc_khz(void)
        printk(KERN_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;
 }