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(-)

