[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] x86/time: use native TSC scaling factors when TSC is not scaled


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Thu, 16 Apr 2026 14:51:49 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yvK8tzfFPUqL8DxuGW02odaYKvZIuwiT17LQHLD9LUM=; b=CAp9+C8TixUjLLMaTUD9MM4vKCkhD8gHhTn/EaUczc3rgAVWPE8Qe75mT7t8d6ZjXnL7D/FmrHvPJ/3PtV0/ZXZN9Jl3o3mX57XOJc9s9xpaJJKY6Hu3aec0oFPa9K3a1zvuXzyivnuZV/KUckTwvQRXBk5Y3MljIh0ms7RQrgACBrZNVkQGECxPTgB1/DvF23H3MrYOpsnyXKi41BwHg+jpw5m/61Du1rCtA4zSIia90TxBpJUsoATZfTf7v7O8LBoIJ5b4TQbBEcvXgD6Dc/3V7obMizrAGuOUEuT/N/zxfoMaT42Kmzw0kRyE6ToB+J8OQRXukNtR++svA8Y3mg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U+FW5CKMJijW+WuotcCmEUrnlZQrEn2kQXaulZ4AVYqRu+Y1/Vhmy5emmb85iR2Cix8L75OxiPveTaBhEYQnIclbyd3kpaWQJva8VA4IIggDDKSOT9/mH4zy6/xXWtw6020EDfsl2Sy4JjWXeEzTuL7a780mCjJ5dJ/9myRPAxQxbRckPYfqMtAZ9TD33LMbjY1JM+/FoH+r3/6ze5jnypR+meQ+vs5zxLet4mzxziWcOi6ftumTqxAD8eUqaLYbb1KkOy0+JWdfuCwCFmcr//aqW/obronEIDu3NgMq4iO6d4ZcKl1a3Aas05F/I1HlJe3oeE/0eEwF9zwgi0ujUA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Thu, 16 Apr 2026 12:51:59 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Thu, Apr 16, 2026 at 01:28:11PM +0200, Jan Beulich wrote:
> On 14.04.2026 12:33, Roger Pau Monne wrote:
> > When running HVM guest in native TSC mode avoid using the recalculated vTSC
> > scaling factors based on the cpu_khz value.  Using the kHz based frequency
> > leads to the TSC scaling values possibly not being the same as the ones
> > used by the per CPU cpu_time->tsc_scale field, which introduces skew
> > between the guest and Xen's calculations of the system time.
> > 
> > On a 2gHz system, where the frequency is possibly detected as 1999999999Hz
> > (note this is a worse-case scenario), the cpu_khz variable will be set to
> > 1999999kHz, and hence 999Hz cycles will be not accounted for per second.
> > Over a second (the time synchronization period), this leads to a skew of:
> > 
> > cycles * 1 / (Hz freq) = 999 / 1999999999 = 499,5ns
> > 
> > So far this has gone unnoticed because the time synchronization rendezvous
> > forces the update of the tsc_timestamp and system_time fields in the vCPU
> > time info area, and hence the skew only accumulates up to the rendezvous
> > period.  Attempting to remove the rendezvous causes the skew to grow
> > unbounded.
> > 
> > Fix by using the native TSC scaling values (as used by Xen) when the guest
> > TSC is not scaled.
> > 
> > Fixes: eab8a90be723 ("x86/time: scale host TSC in pvclock properly")
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> > ---
> > I'm worried about the usage of cpu_khz beyond simple printing it for
> > informational purposes.  Overall I think it would be safer to store the
> > frequency in Hz, as to avoid losing the least significant digits.
> > 
> > In any case, that's a different change.
> 
> I'm not quite sure - improving accuracy is of course a good thing, but will
> we ever be able to do any such calculations error free, when already the
> detected frequency isn't exactly precise?
> 
> > --- a/xen/arch/x86/time.c
> > +++ b/xen/arch/x86/time.c
> > @@ -1710,17 +1710,25 @@ static void collect_time_info(const struct vcpu *v,
> >      else
> >      {
> >          if ( is_hvm_domain(d) && hvm_tsc_scaling_supported )
> > -        {
> >              tsc_stamp            = hvm_scale_tsc(d, t->stamp.local_tsc);
> 
> This is a potentially imprecise calculation. How likely is it that its result
> will indeed ...
> 
> > -            u->tsc_to_system_mul = d->arch.vtsc_to_ns.mul_frac;
> > -            u->tsc_shift         = d->arch.vtsc_to_ns.shift;
> > -        }
> >          else
> > -        {
> >              tsc_stamp            = t->stamp.local_tsc;
> > +
> > +        /*
> > +         * HVM guests using the native TSC ratio should use the same 
> > per-CPU
> > +         * scaling factors as Xen.  This ensures time keeping is always in 
> > sync
> > +         * between Xen and the guest.
> > +         */
> > +        if ( tsc_stamp == t->stamp.local_tsc )
> 
> ... exactly match t->stamp.local_tsc? Don't we possibly need a (small) error
> margin? (In which case of course the next question would be: How to establish
> such a margin?)

hvm_scale_tsc() has:

    if ( ratio == hvm_default_tsc_scaling_ratio )
        return tsc;

So when using no scaling the input value is the output value, and
hence tsc_stamp will match exactly t->stamp.local_tsc.

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.