Now that Paul et al have so kindly provided atomic SRCU for us, it would
be churlish not to use it.

Based on the merge of kvm/next (d4b7fb647204) with Paul's dev.2026.09.17a¹
as posted last week², this series:

 • Converts the GPC to use atomic SRCU, ditching the rwlock which was a
   scaling and latency problem, and which PREEMPT_RT hated because it
   turned the rwlock into a sleeping lock.

 • Cleans up the intentional lack of dirty-tracking of Xen shinfo and
   vcpu_info pages (Sean).

 • Converts steal-time / preempted status to use gfn_to_pfn_cache. (Carsten)
  
 • Reinstates guest-mode pinning: replacing the old GUEST_USES_PFN mode,
   letting nested state pages be cached and pinned while in guest context.
  
 • nVMX: Uses GPC for the L1 MSR bitmap, and guest mode for APIC access
   and vAPIC pages. (Fred)

 • nSVM: Uses GPC for vmcb12 / MSR-permissions / IO-permissions pages. This
   cuts the vmcb12 transition cost measurably (selftest included).

 • Returns -EAGAIN from cache lookups which race with memslot updates,
   and re-posts KVM_REQ_GET_NESTED_STATE_PAGES on memslot generation
   bumps so pinned caches are revalidated lazily.

Tested: rcutorture atomic-SRCU (srcud, reader_flavor=0x10) on three
hosts; KVM selftests including new invalidation and transition tests;
>1 week soak of VM lifecycle + invalidation reproducers on 128-way
RT+KASAN+lockdep, 192-way RT and 192-way PREEMPT_DYNAMIC hosts. And
booted an actual Xen guest in QEMU a few times...

¹ https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git 
dev.2026.09.17a
² https://lore.kernel.org/rcu/[email protected]/

There have been previous series which attempt to deal with various parts
of GPC locking, and the steal time one has definitely been posted before
a few times, but let's just call this v1:
https://git.infradead.org/?p=users/dwmw2/linux.git;a=shortlog;h=refs/heads/gpc-srcu

Carsten Stollmaier (1):
      KVM: x86: Use gfn_to_pfn_cache for steal time / preempted status

David Woodhouse (10):
      KVM: pfncache: Use atomic SRCU for readers instead of a rwlock
      KVM: x86: Request the guest TLB flush from record_steal_time()
      KVM: pfncache: Add guest-mode pinning (GUEST_USES_PFN successor)
      KVM: pfncache: Return -EAGAIN for a lookup which hits an invalid memslot
      KVM: x86: Post KVM_REQ_GET_NESTED_STATE_PAGES on memslot updates
      KVM: x86: Move nested GPC lock helpers to x86.h as kvm_gpc_lock_page()
      KVM: nSVM: Use a gfn_to_pfn_cache for the vmcb12 page
      KVM: nSVM: Cache L1's MSR permissions map pages
      KVM: nSVM: Cache L1's IO permissions map pages
      KVM: selftests: Add nested transition benchmark

Fred Griffoul (3):
      KVM: nVMX: Implement cache for L1 MSR bitmap
      KVM: nVMX: Use pinned pfncache for L1 APIC virtualization pages
      KVM: selftests: Add nested VMX APIC cache invalidation test

Sean Christopherson (3):
      KVM: x86/xen: Extract delivery of event to vCPU into a separate helper
      KVM: x86/xen: Explicitly tag "shared info" page as never being dirty 
tracked
      KVM: x86/xen: Don't dirty track "vCPU info" page


 arch/x86/include/asm/kvm_host.h                    |   2 +-
 arch/x86/kvm/msrs.c                                |   7 +-
 arch/x86/kvm/svm/nested.c                          | 112 +++-
 arch/x86/kvm/svm/svm.h                             |  16 +
 arch/x86/kvm/vmx/nested.c                          | 356 ++++++++++--
 arch/x86/kvm/vmx/vmx.c                             |  11 +-
 arch/x86/kvm/vmx/vmx.h                             |  16 +-
 arch/x86/kvm/x86.c                                 | 181 ++++---
 arch/x86/kvm/x86.h                                 |  33 ++
 arch/x86/kvm/xen.c                                 | 279 +++++-----
 include/linux/kvm_host.h                           |  86 ++-
 include/linux/kvm_types.h                          |  52 +-
 include/linux/srcu.h                               |   7 +
 tools/testing/selftests/kvm/Makefile.kvm           |   2 +
 .../selftests/kvm/x86/nested_transition_bench.c    | 204 +++++++
 .../selftests/kvm/x86/vmx_apic_update_test.c       | 299 +++++++++++
 virt/kvm/kvm_main.c                                |   9 +
 virt/kvm/pfncache.c                                | 596 +++++++++++++++++----
 18 files changed, 1876 insertions(+), 392 deletions(-)

Reply via email to