x86, vmware: Preset lpj values when on VMware.
authorAlok Kataria <akataria@vmware.com>
Mon, 2 Aug 2010 23:10:37 +0000 (16:10 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Tue, 3 Aug 2010 00:16:30 +0000 (17:16 -0700)
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>
arch/x86/kernel/cpu/vmware.c

index b9d1ff5..227b044 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;
 }