Kernel KVM virtualization development
 help / color / mirror / Atom feed
* [PATCH v4 00/11] KVM: x86/hyperv: Fix racy usage of vcpu->arch.hyperv
@ 2026-06-30 22:56 Sean Christopherson
  2026-06-30 22:56 ` [PATCH v4 01/11] KVM: x86/hyperv: Get target FIFO in hv_tlb_flush_enqueue(), not caller Sean Christopherson
                   ` (10 more replies)
  0 siblings, 11 replies; 18+ messages in thread
From: Sean Christopherson @ 2026-06-30 22:56 UTC (permalink / raw)
  To: Vitaly Kuznetsov, Sean Christopherson, Paolo Bonzini,
	David Woodhouse, Paul Durrant
  Cc: kvm, linux-kernel, syzbot+5b32c49cd8f005e65654,
	syzbot+5d2b94b77112148d1744, David Woodhouse

Fix a bug found by syzkaller (originally on a Google-internal kernel, but now
on upstream as well) where KVM consumes a vCPU's HyperV structure before it's
fully initialized, by concurrently triggering PV TLB flushes (queues flushes
into a vCPU's FIFO without holding the vCPU's mutex) on a vCPU that is in the
process of activating HyperV.

Harden against similar bugs by asserting the vcpu->mutex is held when using
the "normal" to_hv_vcpu(), same as we did for get_vmcs12() and
get_shadow_vmcs12() (also in response to cross-task races).  To avoid false
positives when creating a vCPU, initialize vcpu_idx to -1, and treat the vCPU
as unreachable (other than the caller, obviously) if its index is -1.

v4:
 - Route non-timer hypercalls at the very beginning of kvm_xen_hcall_vcpu_op()
   so that KVM doesn't unintentionally resume the guest on bad input (which
   might not even be bad since KVM would misinterpet the input). [Sashiko]
 - Suck less at unwinding on failure, i.e. invalidate the vcpu_idx on any
   failure during vCPU creation. [Sashiko, syzbot]
 - Reference U32_MAX, not -1u. [David]
 - Add a compile-time assert to ensure XEN_VCPU_ID_INVALID can't collide with
   KVM's range of legal values.

v3:
 - https://lore.kernel.org/all/20260625223623.3376478-1-seanjc@google.com
 - Reset vcpu_idx back to -1 if adding the vCPU to the xarray fails. [syzbot]
 - Use the safe accessor in kvm_hv_has_stimer_pending(). [sashiko]
 - Explicitly initialize vcpu->arch.xen.vcpu_id to XEN_VCPU_ID_INVALID, and
   punt singleshot timer hypercalls to userspace if the vCPU ID hasn't been
   set. [sashiko, David]

v2:
 - https://lore.kernel.org/all/20260612230622.687665-1-seanjc@google.com
 - Init vcpu->vcpu_idx to -1, use that as a canary to detect the vCPU is
   unreachable, and allow accessing Hyper-V state if the vCPU is otherwise
   unreachable. [syzbot]

v1: https://lore.kernel.org/all/20260423140833.439512-1-seanjc@google.com

Sean Christopherson (11):
  KVM: x86/hyperv: Get target FIFO in hv_tlb_flush_enqueue(), not caller
  KVM: x86/hyperv: Check for NULL vCPU Hyper-V object in
    kvm_hv_get_tlb_flush_fifo()
  KVM: x86/hyperv: Ensure vCPU's Hyper-V object is initialized on
    cross-vCPU accesses
  KVM: x86/xen: Always route non-singleshot-timer vCPU hypercalls to
    userspace
  KVM: x86/xen: Consolidate checks on Xen vCPU ID for singleshot timer
    hypercalls
  KVM: x86/xen: Punt singleshot timer hcalls to userspace if Xen vCPU ID
    isn't set
  KVM: Initialize a vCPU's index to '-1' while it's being created
  KVM: Move nVMX's lockdep logic for vcpu->mutex to a common helper
  KVM: x86: Treat a vCPU as unreachable if its index is invalid
  KVM: x86/hyperv: Assert vCPU's mutex is held in to_hv_vcpu()
  KVM: x86/hyperv: Use {READ,WRITE}_ONCE for cross-task synic->active
    accesses

 arch/x86/kvm/hyperv.c     | 64 +++++++++++++++++++++------------------
 arch/x86/kvm/hyperv.h     | 27 ++++++++++++++---
 arch/x86/kvm/vmx/nested.h |  6 ++--
 arch/x86/kvm/xen.c        | 43 +++++++++++++++-----------
 include/linux/kvm_host.h  |  7 +++++
 virt/kvm/kvm_main.c       |  8 +++++
 6 files changed, 99 insertions(+), 56 deletions(-)


base-commit: a204badd8432f93b7e862e7dac6db0fe3d65f370
-- 
2.55.0.rc0.799.gd6f94ed593-goog


^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2026-07-01 15:07 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-30 22:56 [PATCH v4 00/11] KVM: x86/hyperv: Fix racy usage of vcpu->arch.hyperv Sean Christopherson
2026-06-30 22:56 ` [PATCH v4 01/11] KVM: x86/hyperv: Get target FIFO in hv_tlb_flush_enqueue(), not caller Sean Christopherson
2026-06-30 22:56 ` [PATCH v4 02/11] KVM: x86/hyperv: Check for NULL vCPU Hyper-V object in kvm_hv_get_tlb_flush_fifo() Sean Christopherson
2026-07-01 15:02   ` Philippe Mathieu-Daudé
2026-06-30 22:56 ` [PATCH v4 03/11] KVM: x86/hyperv: Ensure vCPU's Hyper-V object is initialized on cross-vCPU accesses Sean Christopherson
2026-06-30 22:56 ` [PATCH v4 04/11] KVM: x86/xen: Always route non-singleshot-timer vCPU hypercalls to userspace Sean Christopherson
2026-06-30 22:56 ` [PATCH v4 05/11] KVM: x86/xen: Consolidate checks on Xen vCPU ID for singleshot timer hypercalls Sean Christopherson
2026-07-01 15:03   ` Philippe Mathieu-Daudé
2026-06-30 22:56 ` [PATCH v4 06/11] KVM: x86/xen: Punt singleshot timer hcalls to userspace if Xen vCPU ID isn't set Sean Christopherson
2026-06-30 23:08   ` sashiko-bot
2026-06-30 22:56 ` [PATCH v4 07/11] KVM: Initialize a vCPU's index to '-1' while it's being created Sean Christopherson
2026-07-01 15:06   ` Philippe Mathieu-Daudé
2026-06-30 22:56 ` [PATCH v4 08/11] KVM: Move nVMX's lockdep logic for vcpu->mutex to a common helper Sean Christopherson
2026-07-01 15:04   ` Philippe Mathieu-Daudé
2026-06-30 22:56 ` [PATCH v4 09/11] KVM: x86: Treat a vCPU as unreachable if its index is invalid Sean Christopherson
2026-07-01 15:07   ` Philippe Mathieu-Daudé
2026-06-30 22:56 ` [PATCH v4 10/11] KVM: x86/hyperv: Assert vCPU's mutex is held in to_hv_vcpu() Sean Christopherson
2026-06-30 22:56 ` [PATCH v4 11/11] KVM: x86/hyperv: Use {READ,WRITE}_ONCE for cross-task synic->active accesses Sean Christopherson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox