[GIT PULL] KVM: x86: MMU changes for 6.12

From: Sean Christopherson
Date: Fri Sep 13 2024 - 21:14:46 EST


The bulk of the changes are to clean up the thorny "unprotect and retry" mess
that grew over time. The other notable change is to support yielding in the
shadow MMU when zapping rmaps (simply a historic oversight, AFAICT).

The following changes since commit 47ac09b91befbb6a235ab620c32af719f8208399:

Linux 6.11-rc4 (2024-08-18 13:17:27 -0700)

are available in the Git repository at:

https://github.com/kvm-x86/linux.git tags/kvm-x86-mmu-6.12

for you to fetch changes up to 9a5bff7f5ec2383e3edac5eda561b52e267ccbb5:

KVM: x86/mmu: Use KVM_PAGES_PER_HPAGE() instead of an open coded equivalent (2024-09-09 20:22:08 -0700)

----------------------------------------------------------------
KVM x86 MMU changes for 6.12:

- Overhaul the "unprotect and retry" logic to more precisely identify cases
where retrying is actually helpful, and to harden all retry paths against
putting the guest into an infinite retry loop.

- Add support for yielding, e.g. to honor NEED_RESCHED, when zapping rmaps in
the shadow MMU.

- Refactor pieces of the shadow MMU related to aging SPTEs in prepartion for
adding MGLRU support in KVM.

- Misc cleanups

----------------------------------------------------------------
Sean Christopherson (33):
KVM: x86/mmu: Clean up function comments for dirty logging APIs
KVM: x86/mmu: Decrease indentation in logic to sync new indirect shadow page
KVM: x86/mmu: Drop pointless "return" wrapper label in FNAME(fetch)
KVM: x86/mmu: Reword a misleading comment about checking gpte_changed()
KVM: x86/mmu: Replace PFERR_NESTED_GUEST_PAGE with a more descriptive helper
KVM: x86/mmu: Trigger unprotect logic only on write-protection page faults
KVM: x86/mmu: Skip emulation on page fault iff 1+ SPs were unprotected
KVM: x86: Retry to-be-emulated insn in "slow" unprotect path iff sp is zapped
KVM: x86: Get RIP from vCPU state when storing it to last_retry_eip
KVM: x86: Store gpa as gpa_t, not unsigned long, when unprotecting for retry
KVM: x86/mmu: Apply retry protection to "fast nTDP unprotect" path
KVM: x86/mmu: Try "unprotect for retry" iff there are indirect SPs
KVM: x86: Move EMULTYPE_ALLOW_RETRY_PF to x86_emulate_instruction()
KVM: x86: Fold retry_instruction() into x86_emulate_instruction()
KVM: x86/mmu: Don't try to unprotect an INVALID_GPA
KVM: x86/mmu: Always walk guest PTEs with WRITE access when unprotecting
KVM: x86/mmu: Move event re-injection unprotect+retry into common path
KVM: x86: Remove manual pfn lookup when retrying #PF after failed emulation
KVM: x86: Check EMULTYPE_WRITE_PF_TO_SP before unprotecting gfn
KVM: x86: Apply retry protection to "unprotect on failure" path
KVM: x86: Update retry protection fields when forcing retry on emulation failure
KVM: x86: Rename reexecute_instruction()=>kvm_unprotect_and_retry_on_failure()
KVM: x86/mmu: Subsume kvm_mmu_unprotect_page() into the and_retry() version
KVM: x86/mmu: Detect if unprotect will do anything based on invalid_list
KVM: x86/mmu: WARN on MMIO cache hit when emulating write-protected gfn
KVM: x86/mmu: Move walk_slot_rmaps() up near for_each_slot_rmap_range()
KVM: x86/mmu: Plumb a @can_yield parameter into __walk_slot_rmaps()
KVM: x86/mmu: Add a helper to walk and zap rmaps for a memslot
KVM: x86/mmu: Honor NEED_RESCHED when zapping rmaps and blocking is allowed
KVM: x86/mmu: Morph kvm_handle_gfn_range() into an aging specific helper
KVM: x86/mmu: Fold mmu_spte_age() into kvm_rmap_age_gfn_range()
KVM: x86/mmu: Add KVM_RMAP_MANY to replace open coded '1' and '1ul' literals
KVM: x86/mmu: Use KVM_PAGES_PER_HPAGE() instead of an open coded equivalent

arch/x86/include/asm/kvm_host.h | 14 +-
arch/x86/kvm/mmu/mmu.c | 522 ++++++++++++++++++++++------------------
arch/x86/kvm/mmu/mmu_internal.h | 3 +
arch/x86/kvm/mmu/mmutrace.h | 1 +
arch/x86/kvm/mmu/paging_tmpl.h | 63 ++---
arch/x86/kvm/mmu/tdp_mmu.c | 6 +-
arch/x86/kvm/x86.c | 133 +++-------
7 files changed, 368 insertions(+), 374 deletions(-)