From: sashiko-bot@kernel.org
To: "Sean Christopherson" <seanjc@google.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH v6 2/2] KVM: VMX: Cap VMX preemption timer to work around Intel erratum
Date: Wed, 29 Jul 2026 13:50:54 +0000 [thread overview]
Message-ID: <20260729135054.B5CAA1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260729134203.1377606-3-seanjc@google.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] The computed VMX preemption timer maximum value can exceed 32 bits on modern CPUs because it is not clamped to the architectural limit (UINT_MAX). This leads to silent 32-bit truncation when written to the VMCS, breaking the timer's soft-disable mechanism and causing premature guest timer expirations.
--
--- Patch [2]: [PATCH v6 2/2] KVM: VMX: Cap VMX preemption timer to work around Intel erratum ---
commit 021d423821c3a8ec582691801fee4d57b9a316fc
Author: Jim Mattson <jmattson@google.com>
KVM: VMX: Cap VMX preemption timer to work around Intel erratum
This commit introduces a workaround for an Intel erratum where the VMX
preemption timer can expire early if programmed with large values. It
calculates a safe maximum value based on CPUID.15H. This maximum is then
used when the timer is soft-disabled and to bound delta_tsc.
Closes: https://lore.kernel.org/all/Zn9X0yFxZi_Mrlnt@google.com/
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 7d2cc36a04e51..67c8dc1eb2c4f 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
[ ... ]
> @@ -8305,6 +8306,33 @@ static inline int u64_shl_div_u64(u64 a, unsigned int shift,
> return 0;
> }
>
> +/*
> + * Workaround for a widespread Intel erratum (e.g. EMR158) where the
> + * VMX-preemption timer may expire earlier than expected when programmed
> + * with large values. The workaround is to cap the timer value to strictly
> + * less than 2^25 * CPUID.15H:EBX / CPUID.15H:EAX.
> + */
> +static __init u64 calc_preemption_timer_max_value(void)
> +{
> + const u64 ARCHITECTURAL_MAX_VALUE = UINT_MAX;
> + u32 eax, ebx, ecx, edx;
[ ... ]
> + if (WARN_ON_ONCE(!(((u64)ebx << 25) / eax)))
> + return ARCHITECTURAL_MAX_VALUE;
> +
> + return (((u64)ebx << 25) / eax) - 1;
[Severity: High]
If a CPU has a high TSC-to-crystal clock ratio (for example, EBX/EAX >= 128),
could this calculation exceed UINT_MAX? Because the returned u64 is not clamped
to ARCHITECTURAL_MAX_VALUE, preemption_timer_max_value could end up storing a
value larger than 32 bits.
> +}
[ ... ]
> @@ -8362,12 +8392,12 @@ int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc,
> return -ERANGE;
>
> /*
> - * If the delta tsc can't fit in the 32 bit after the multi shift,
> - * we can't use the preemption timer.
> + * If the delta tsc exceeds the preemption timer limit after the
> + * multi shift, we can't use the preemption timer.
> * It's possible that it fits on later vmentries, but checking
> * on every vmentry is costly so we just use an hrtimer.
> */
> - if (delta_tsc >> (cpu_preemption_timer_multi + 32))
> + if ((delta_tsc >> cpu_preemption_timer_multi) > preemption_timer_max_value)
> return -ERANGE;
[Severity: High]
If preemption_timer_max_value is greater than UINT_MAX, does this condition fail
to catch delta_tsc limits that exceed 32 bits? It appears this might bypass the
required hrtimer fallback for large guest deadlines, as the value will later be
silently truncated.
>
> vmx->hv_deadline_tsc = tscl + delta_tsc;
[ ... ]
> @@ -8401,7 +8431,7 @@ static void vmx_update_hv_timer(struct kvm_vcpu *vcpu, bool force_immediate_exit
> vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, delta_tsc);
> vmx->loaded_vmcs->hv_timer_soft_disabled = false;
> } else if (!vmx->loaded_vmcs->hv_timer_soft_disabled) {
> - vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, -1);
> + vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, preemption_timer_max_value);
> vmx->loaded_vmcs->hv_timer_soft_disabled = true;
> }
> }
[Severity: High]
Will writing an un-clamped u64 to vmcs_write32() cause it to be truncated? If
truncated, the preemption timer could fire prematurely when soft-disabled
instead of waiting for the maximum duration.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260729134203.1377606-1-seanjc@google.com?part=2
next prev parent reply other threads:[~2026-07-29 13:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 13:42 [PATCH v6 0/2] KVM: VMX: Workaround VMX preemption timer erratum Sean Christopherson
2026-07-29 13:42 ` [PATCH v6 1/2] KVM: VMX: Bury all of the VMX preemption timer code under CONFIG_X86_64=y Sean Christopherson
2026-07-29 13:42 ` [PATCH v6 2/2] KVM: VMX: Cap VMX preemption timer to work around Intel erratum Sean Christopherson
2026-07-29 13:50 ` sashiko-bot [this message]
2026-07-29 13:57 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260729135054.B5CAA1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=seanjc@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.