Re: [Patch] Skip cpu_calibrate for kernel running under hypervisors.

Alok Kataria
2010-08-17T05:51:53Z

Thanks for taking a look.

On Mon, 2010-08-16 at 16:56 -0700, H. Peter Anvin wrote:
> On 08/16/2010 12:25 PM, Alok Kataria wrote:
> > Hi,
> >
> > This is a trivial change to fix the cpu_khz value returned when running
> > on a virtualized environment. We have seen instances when the cpu_khz
> > value is off by couple of MHz's when running on VMware's platform on AMD
> > hardware.
> >
> > --
> > Since the TSC frequency read from hypervisor is accurate for the guest, and
> > since the hypervisor will always clock the vcpu at the TSC frequency, there is
> > no need to calibrate it again. To avoid any calibration errors through
> > calibrate_cpu this patch skips calling calibrate_cpu for kernel running
> > under hypervisors.
> >
>
> I'm somewhat reluctant to take this one, since it assumes all the
> hypervisors act the same. This seems rather inherently wrong. In fact,
> the whole statement is fishy as heck... instead of being dependent on
> AMD and so on,

The check about being on AMD is something that was already there.

> this should either be a function pointer or a CPU
> (mis)feature bit.

In any case, I agree that my previous patch did assume all hypervisors
to be same, which might be wrong. How about using the
X86_FEATURE_TSC_RELIABLE bit for this too ? i.e. Skip cpu_calibrate call
if TSC_RELIABLE bit is set. As of now that bit is set for vmware only.

Something like the below.

Signed-off-by: Alok N Kataria <akataria@vmware.com>
Cc: H. Peter Anvin <hpa@zytor.com>

Index: linux-x86-tree.git/arch/x86/kernel/tsc.c
===================================================================
--- linux-x86-tree.git.orig/arch/x86/kernel/tsc.c 2010-08-03 12:21:20.000000000 -0700
+++ linux-x86-tree.git/arch/x86/kernel/tsc.c 2010-08-16 21:59:32.000000000 -0700
@@ -927,7 +927,8 @@ void __init tsc_init(void)
}

if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) &&
- (boot_cpu_data.x86_vendor == X86_VENDOR_AMD))
+ (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) &&
+ !(cpu_has(&boot_cpu_data, X86_FEATURE_TSC_RELIABLE)))
cpu_khz = calibrate_cpu();

printk("Detected %lu.%03lu MHz processor.\n",