Skip to content

Commit caea091

Browse files
kmjohansenjgross1
authored andcommitted
x86/xen/time: prefer tsc as clocksource when it is invariant
Kvm elects to use tsc instead of kvm-clock when it can detect that the TSC is invariant. (As of commit 7539b17 ("x86: kvmguest: use TSC clocksource if invariant TSC is exposed")). Notable cloud vendors[1] and performance engineers[2] recommend that Xen users preferentially select tsc over xen-clocksource due the performance penalty incurred by the latter. These articles are persuasive and tailored to specific use cases. In order to understand the tradeoffs around this choice more fully, this author had to reference the documented[3] complexities around the Xen configuration, as well as the kernel's clocksource selection algorithm. Many users may not attempt this to correctly configure the right clock source in their guest. The approach taken in the kvm-clock module spares users this confusion, where possible. Both the Intel SDM[4] and the Xen tsc documentation explain that marking a tsc as invariant means that it should be considered stable by the OS and is elibile to be used as a wall clock source. In order to obtain better out-of-the-box performance, and reduce the need for user tuning, follow kvm's approach and decrease the xen clock rating so that tsc is preferable, if it is invariant, stable, and the tsc will never be emulated. [1] https://aws.amazon.com/premiumsupport/knowledge-center/manage-ec2-linux-clock-source/ [2] https://www.brendangregg.com/blog/2021-09-26/the-speed-of-time.html [3] https://xenbits.xen.org/docs/unstable/man/xen-tscmode.7.html [4] Intel 64 and IA-32 Architectures Sofware Developer's Manual Volume 3b: System Programming Guide, Part 2, Section 17.17.1, Invariant TSC Signed-off-by: Krister Johansen <[email protected]> Code-reviewed-by: David Reaver <[email protected]> Reviewed-by: Juergen Gross <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Juergen Gross <[email protected]>
1 parent f697cb0 commit caea091

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

arch/x86/xen/time.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,15 +474,51 @@ static void xen_setup_vsyscall_time_info(void)
474474
xen_clocksource.vdso_clock_mode = VDSO_CLOCKMODE_PVCLOCK;
475475
}
476476

477+
/*
478+
* Check if it is possible to safely use the tsc as a clocksource. This is
479+
* only true if the hypervisor notifies the guest that its tsc is invariant,
480+
* the tsc is stable, and the tsc instruction will never be emulated.
481+
*/
482+
static int __init xen_tsc_safe_clocksource(void)
483+
{
484+
u32 eax, ebx, ecx, edx;
485+
486+
if (!(boot_cpu_has(X86_FEATURE_CONSTANT_TSC)))
487+
return 0;
488+
489+
if (!(boot_cpu_has(X86_FEATURE_NONSTOP_TSC)))
490+
return 0;
491+
492+
if (check_tsc_unstable())
493+
return 0;
494+
495+
/* Leaf 4, sub-leaf 0 (0x40000x03) */
496+
cpuid_count(xen_cpuid_base() + 3, 0, &eax, &ebx, &ecx, &edx);
497+
498+
/* tsc_mode = no_emulate (2) */
499+
if (ebx != 2)
500+
return 0;
501+
502+
return 1;
503+
}
504+
477505
static void __init xen_time_init(void)
478506
{
479507
struct pvclock_vcpu_time_info *pvti;
480508
int cpu = smp_processor_id();
481509
struct timespec64 tp;
482510

483-
/* As Dom0 is never moved, no penalty on using TSC there */
511+
/*
512+
* As Dom0 is never moved, no penalty on using TSC there.
513+
*
514+
* If it is possible for the guest to determine that the tsc is a safe
515+
* clocksource, then set xen_clocksource rating below that of the tsc
516+
* so that the system prefers tsc instead.
517+
*/
484518
if (xen_initial_domain())
485519
xen_clocksource.rating = 275;
520+
else if (xen_tsc_safe_clocksource())
521+
xen_clocksource.rating = 299;
486522

487523
clocksource_register_hz(&xen_clocksource, NSEC_PER_SEC);
488524

0 commit comments

Comments
 (0)