| From 9f242dc10e0c3c1eb32d8c83c18650a35fd7f80d Mon Sep 17 00:00:00 2001 |
| From: Alok Kataria <akataria@vmware.com> |
| Date: Mon, 2 Aug 2010 16:10:37 -0700 |
| Subject: x86, vmware: Preset lpj values when on VMware. |
| |
| From: Alok Kataria <akataria@vmware.com> |
| |
| 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 | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/cpu/vmware.c |
| +++ b/arch/x86/kernel/cpu/vmware.c |
| @@ -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( |
| 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; |
| } |
| |