Rework the TDP MMU disable-dirty-log path to batch TLB flushes and recover huge page mappings, rather than zapping and flushing for every potential huge page mapping. With this series, dirty_log_perf_test shows a decrease in the time it takes to disable dirty logging, as well as a decrease in the number of vCPU faults: $ ./dirty_log_perf_test -s anonymous_hugetlb_2mb -v 64 -e -b 4g Before: Disabling dirty logging time: 14.334453428s (131072 flushes) After: Disabling dirty logging time: 4.794969689s (76 flushes) Before: 393,599 kvm:kvm_page_fault After: 262,575 kvm:kvm_page_fault v2: - Use a separate iterator to walk down to child SPTEs during huge page recovery [Sean] - Return SHADOW_NONPRESENT_VALUE in error conditions in make_huge_spte() [Vipin][off-list] v1: https://lore.kernel.org/kvm/20240805233114.4060019-8-dmatlack@xxxxxxxxxx/ David Matlack (6): KVM: x86/mmu: Drop @max_level from kvm_mmu_max_mapping_level() KVM: x86/mmu: Batch TLB flushes when zapping collapsible TDP MMU SPTEs KVM: x86/mmu: Refactor TDP MMU iter need resched check KVM: x86/mmu: Recover TDP MMU huge page mappings in-place instead of zapping KVM: x86/mmu: Rename make_huge_page_split_spte() to make_small_spte() KVM: x86/mmu: WARN if huge page recovery triggered during dirty logging arch/x86/include/asm/kvm_host.h | 4 +- arch/x86/kvm/mmu/mmu.c | 16 ++-- arch/x86/kvm/mmu/mmu_internal.h | 3 +- arch/x86/kvm/mmu/spte.c | 43 +++++++++-- arch/x86/kvm/mmu/spte.h | 5 +- arch/x86/kvm/mmu/tdp_mmu.c | 129 +++++++++++++++++--------------- arch/x86/kvm/mmu/tdp_mmu.h | 4 +- arch/x86/kvm/x86.c | 18 ++--- 8 files changed, 128 insertions(+), 94 deletions(-) base-commit: 728d17c2cb8cc5f9ac899173d0e9a67fb8887622 -- 2.46.0.295.g3b9ea8a38a-goog