[PATCH] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled

Sean Christopherson posted 1 patch 3 weeks, 4 days ago
arch/x86/kvm/svm/avic.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
[PATCH] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled
Posted by Sean Christopherson 3 weeks, 4 days ago
When allocating the AVIC backing page, only check one of the max AVIC vs.
x2AVIC ID based on whether or not x2AVIC is enabled.  Doing so fixes a bug
where KVM incorrectly inhibits AVIC if x2AVIC is _disabled_ and any vCPU
with a non-zero APIC ID is created, as x2avic_max_physical_id is left '0'
when x2AVIC is disabled.

Fixes: 940fc47cfb0d ("KVM: SVM: Add AVIC support for 4k vCPUs in x2AVIC mode")
Cc: stable@vger.kernel.org
Cc: Naveen N Rao (AMD) <naveen@kernel.org>
Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
 arch/x86/kvm/svm/avic.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c
index 6b77b2033208..0f6c8596719b 100644
--- a/arch/x86/kvm/svm/avic.c
+++ b/arch/x86/kvm/svm/avic.c
@@ -376,6 +376,7 @@ void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb)
 
 static int avic_init_backing_page(struct kvm_vcpu *vcpu)
 {
+	u32 max_id = x2avic_enabled ? x2avic_max_physical_id : AVIC_MAX_PHYSICAL_ID;
 	struct kvm_svm *kvm_svm = to_kvm_svm(vcpu->kvm);
 	struct vcpu_svm *svm = to_svm(vcpu);
 	u32 id = vcpu->vcpu_id;
@@ -388,8 +389,7 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu)
 	 * avic_vcpu_load() expects to be called if and only if the vCPU has
 	 * fully initialized AVIC.
 	 */
-	if ((!x2avic_enabled && id > AVIC_MAX_PHYSICAL_ID) ||
-	    (id > x2avic_max_physical_id)) {
+	if (id > max_id) {
 		kvm_set_apicv_inhibit(vcpu->kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_TOO_BIG);
 		vcpu->arch.apic->apicv_active = false;
 		return 0;

base-commit: 9448598b22c50c8a5bb77a9103e2d49f134c9578
-- 
2.52.0.457.g6b5491de43-goog
Re: [PATCH] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled
Posted by Sean Christopherson 3 weeks, 1 day ago
On Mon, 12 Jan 2026 15:28:05 -0800, Sean Christopherson wrote:
> When allocating the AVIC backing page, only check one of the max AVIC vs.
> x2AVIC ID based on whether or not x2AVIC is enabled.  Doing so fixes a bug
> where KVM incorrectly inhibits AVIC if x2AVIC is _disabled_ and any vCPU
> with a non-zero APIC ID is created, as x2avic_max_physical_id is left '0'
> when x2AVIC is disabled.
> 
> 
> [...]

Applied to kvm-x86 fixes, thanks!

[1/1] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled
      https://github.com/kvm-x86/linux/commit/cfbe371194d1

--
https://github.com/kvm-x86/linux/tree/next
Re: [PATCH] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled
Posted by Naveen N Rao 3 weeks, 2 days ago
On Mon, Jan 12, 2026 at 03:28:05PM -0800, Sean Christopherson wrote:
> When allocating the AVIC backing page, only check one of the max AVIC vs.
> x2AVIC ID based on whether or not x2AVIC is enabled.  Doing so fixes a bug
> where KVM incorrectly inhibits AVIC if x2AVIC is _disabled_ and any vCPU
> with a non-zero APIC ID is created, as x2avic_max_physical_id is left '0'
> when x2AVIC is disabled.
> 
> Fixes: 940fc47cfb0d ("KVM: SVM: Add AVIC support for 4k vCPUs in x2AVIC mode")
> Cc: stable@vger.kernel.org
> Cc: Naveen N Rao (AMD) <naveen@kernel.org>
> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
>  arch/x86/kvm/svm/avic.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

I think the bad commit is:
f628a34a9d52 ("KVM: SVM: Replace "avic_mode" enum with "x2avic_enabled" boolean")

... which introduced x2avic_enabled.

Other than that:
Reviewed-by: Naveen N Rao (AMD) <naveen@kernel.org>


Thanks,
Naveen
Re: [PATCH] KVM: SVM: Check vCPU ID against max x2AVIC ID if and only if x2AVIC is enabled
Posted by Sean Christopherson 3 weeks, 2 days ago
On Wed, Jan 14, 2026, Naveen N Rao wrote:
> On Mon, Jan 12, 2026 at 03:28:05PM -0800, Sean Christopherson wrote:
> > When allocating the AVIC backing page, only check one of the max AVIC vs.
> > x2AVIC ID based on whether or not x2AVIC is enabled.  Doing so fixes a bug
> > where KVM incorrectly inhibits AVIC if x2AVIC is _disabled_ and any vCPU
> > with a non-zero APIC ID is created, as x2avic_max_physical_id is left '0'
> > when x2AVIC is disabled.
> > 
> > Fixes: 940fc47cfb0d ("KVM: SVM: Add AVIC support for 4k vCPUs in x2AVIC mode")
> > Cc: stable@vger.kernel.org
> > Cc: Naveen N Rao (AMD) <naveen@kernel.org>
> > Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> > Signed-off-by: Sean Christopherson <seanjc@google.com>
> > ---
> >  arch/x86/kvm/svm/avic.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> I think the bad commit is:
> f628a34a9d52 ("KVM: SVM: Replace "avic_mode" enum with "x2avic_enabled" boolean")
> 
> ... which introduced x2avic_enabled.

No.  That commit definitely set a trap for 4k vCPUs support, but there was no
functional bug as of that commit.  KVM would unnecessarily check @id against
X2AVIC_MAX_PHYSICAL_ID, but it's a non-issue because X2AVIC_MAX_PHYSICAL_ID is
a constant and greater than AVIC_MAX_PHYSICAL_ID.

        if ((!x2avic_enabled && id > AVIC_MAX_PHYSICAL_ID) ||
            (id > X2AVIC_MAX_PHYSICAL_ID))
                return -EINVAL;

So from a "what LTS commits need this fix" perspective, it's just the ones with
940fc47cfb0d.