clocksource: hyper-v: Use lapic timer in a TDX VM without paravisor
Subsystems (5)
Dexuan Cui
maintainerPATCH v2 1/1 clocksource: hyper-v: Use lapic timer in a TDX VM without paravisor
In a TDX VM without paravisor, currently the default timer is the Hyper-V timer, which depends on the slow VM Reference Counter MSR: the Hyper-V TSC page is not enabled in such a VM because the VM uses Invariant TSC as a better clocksource and it's challenging to mark the Hyper-V TSC page shared in very early boot.
Lower the rating of the Hyper-V timer so the local APIC timer becomes the the default timer in such a VM, and print a warning in case Invariant TSC is unavailable in such a VM. This change should cause no perceivable performance difference.
---
Changes in v2:
Improved the comments in ms_hyperv_init_platform() [Michael Kelley] Added "print a warning in case Invariant TSC unavailable" in the changelog. Added Roman's Reviewed-by.
arch/x86/kernel/cpu/mshyperv.c | 16 +++++++++++++++- drivers/clocksource/hyperv_timer.c | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/mshyperv.c +15 -1
@@ -449,9 +449,23 @@ static void __init ms_hyperv_init_platform(void) ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED ;if (!ms_hyperv.paravisor_present) { -/* To be supported: more work is required. */ +/* +* Mark the Hyper-V TSC page feature as disabled +* in a TDX VM without paravisor so that the +* Invariant TSC, which is a better clocksource +* anyway, is used instead. +*/ ms_hyperv.features &= ~HV_MSR_REFERENCE_TSC_AVAILABLE ; +/* +* The Invariant TSC is expected to be available +* in a TDX VM without paravisor, but if not, +* print a warning message. The slower Hyper-V MSR-based +* Ref Counter should end up being the clocksource. +*/ +if (!(ms_hyperv.features &HV_ACCESS_TSC_INVARIANT )) +pr_warn ("Hyper-V: Invariant TSC is unavailable\n" ); +/* HV_MSR_CRASH_CTL is unsupported. */ ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE ;
drivers/clocksource/hyperv_timer.c +15 -1
@@ -137,7 +137,21 @@ static int hv_stimer_init(unsigned int cpu) ce->name ="Hyper-V clockevent" ; ce->features =CLOCK_EVT_FEAT_ONESHOT ; ce->cpumask =cpumask_of (cpu); - ce->rating =1000 ; + +/* +* Lower the rating of the Hyper-V timer in a TDX VM without paravisor, +* so the local APIC timer (lapic_clockevent) is the default timer in +* such a VM. The Hyper-V timer is not preferred in such a VM because +* it depends on the slow VM Reference Counter MSR (the Hyper-V TSC +* page is not enbled in such a VM because the VM uses Invariant TSC +* as a better clocksource and it's challenging to mark the Hyper-V +* TSC page shared in very early boot). +*/ +if (!ms_hyperv.paravisor_present &&hv_isolation_type_tdx ()) + ce->rating =90 ; +else + ce->rating =1000 ; + ce->set_state_shutdown = hv_ce_shutdown; ce->set_state_oneshot = hv_ce_set_oneshot; ce->set_next_event = hv_ce_set_next_event;
Signature · 1 line
2.25.1
From: Dexuan Cui <[email protected]> Sent: Thursday, June 20, 2024 11:16 PM
Quoted 83 lines
In a TDX VM without paravisor, currently the default timer is the Hyper-V timer, which depends on the slow VM Reference Counter MSR: the Hyper-V TSC page is not enabled in such a VM because the VM uses Invariant TSC as a better clocksource and it's challenging to mark the Hyper-V TSC page shared in very early boot.
Lower the rating of the Hyper-V timer so the local APIC timer becomes the the default timer in such a VM, and print a warning in case Invariant TSC is unavailable in such a VM. This change should cause no perceivable performance difference.
Cc [email protected] # 6.6+Reviewed-by Roman Kisel <[email protected]>Signed-off-by Dexuan Cui <[email protected]>---
Changes in v2:
Improved the comments inms_hyperv_init_platform()[Michael Kelley] Added "print a warning in case Invariant TSC unavailable" in the changelog. Added Roman's Reviewed-by.arch/x86/kernel/cpu/mshyperv.c | 16 +++++++++++++++- drivers/clocksource/hyperv_timer.c | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-)arch/x86/kernel/cpu/mshyperv.c +15
-1@@ -449,9 +449,23 @@ static void __init ms_hyperv_init_platform(void) ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED ;if (!ms_hyperv.paravisor_present) { -/* To be supported: more work is required. */ +/* +* Mark the Hyper-V TSC page feature as disabled +* in a TDX VM without paravisor so that the +* Invariant TSC, which is a better clocksource +* anyway, is used instead. +*/ ms_hyperv.features &= ~HV_MSR_REFERENCE_TSC_AVAILABLE ; +/* +* The Invariant TSC is expected to be available +* in a TDX VM without paravisor, but if not, +* print a warning message. The slower Hyper-V MSR-based +* Ref Counter should end up being the clocksource. +*/ +if (!(ms_hyperv.features &HV_ACCESS_TSC_INVARIANT )) +pr_warn ("Hyper-V: Invariant TSC is unavailable\n" ); +/* HV_MSR_CRASH_CTL is unsupported. */ ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE ;drivers/clocksource/hyperv_timer.c +15
-2@@ -137,7 +137,21 @@ static int hv_stimer_init(unsigned int cpu) ce->name ="Hyper-V clockevent" ; ce->features =CLOCK_EVT_FEAT_ONESHOT ; ce->cpumask =cpumask_of (cpu); - ce->rating =1000 ; + +/* +* Lower the rating of the Hyper-V timer in a TDX VM without paravisor, +* so the local APIC timer (lapic_clockevent) is the default timer in +* such a VM. The Hyper-V timer is not preferred in such a VM because +* it depends on the slow VM Reference Counter MSR (the Hyper-V TSC +* page is not enbled in such a VM because the VM uses Invariant TSC +* as a better clocksource and it's challenging to mark the Hyper-V +* TSC page shared in very early boot). +*/ +if (!ms_hyperv.paravisor_present &&hv_isolation_type_tdx ()) + ce->rating =90 ; +else + ce->rating =1000 ; + ce->set_state_shutdown = hv_ce_shutdown; ce->set_state_oneshot = hv_ce_set_oneshot; ce->set_next_event = hv_ce_set_next_event; --
Quoted 1 line
2.25.1
Quoted 6 lines · Dexuan Cui
In a TDX VM without paravisor, currently the default timer is the Hyper-V timer, which depends on the slow VM Reference Counter MSR: the Hyper-V TSC page is not enabled in such a VM because the VM uses Invariant TSC as a better clocksource and it's challenging to mark the Hyper-V TSC page shared in very early boot.
Quoted 8 lines
Lower the rating of the Hyper-V timer so the local APIC timer becomes the the default timer in such a VM, and print a warning in case Invariant TSC is unavailable in such a VM. This change should cause no perceivable performance difference.
Cc [email protected] # 6.6+Reviewed-by Roman Kisel <[email protected]>Signed-off-by Dexuan Cui <[email protected]>
Applied to hyperv-fixes. Thanks.