This applies on top of the massive "follow pfn" rework[*]. The gist is to avoid losing accessed information, e.g. because NUMA balancing mucks with PTEs, by preserving accessed state when KVM zaps SPTEs in response to mmu_notifier invalidations that are for protection changes, e.g. PROT_NUMA. RFC as I haven't done any testing to verify whether or not this has any impact on page aging, let alone has _postivie_ impact. Personally, I'm not at all convinced that this is necessary outside of tests that care about exact counts, e.g. KVM selftests. That said, I do think patches 1-7 would be worth merging on their own. Using A/D bits to track state even when A/D bits are disabled in hardware is a nice cleanup. [*] https://lore.kernel.org/all/20240726235234.228822-1-seanjc@xxxxxxxxxx Sean Christopherson (9): KVM: x86/mmu: Add a dedicated flag to track if A/D bits are globally enabled KVM: x86/mmu: Set shadow_accessed_mask for EPT even if A/D bits disabled KVM: x86/mmu: Set shadow_dirty_mask for EPT even if A/D bits disabled KVM: x86/mmu: Use Accessed bit even when _hardware_ A/D bits are disabled KVM: x86/mmu: Free up A/D bits in FROZEN_SPTE KVM: x86/mmu: Process only valid TDP MMU roots when aging a gfn range KVM: x86/mmu: Stop processing TDP MMU roots for test_age if young SPTE found KVM: Plumb mmu_notifier invalidation event type into arch code KVM: x86/mmu: Track SPTE accessed info across mmu_notifier PROT changes arch/x86/kvm/mmu/mmu.c | 10 ++-- arch/x86/kvm/mmu/spte.c | 16 ++++-- arch/x86/kvm/mmu/spte.h | 39 +++++-------- arch/x86/kvm/mmu/tdp_mmu.c | 113 +++++++++++++++++++++---------------- include/linux/kvm_host.h | 1 + virt/kvm/kvm_main.c | 1 + 6 files changed, 99 insertions(+), 81 deletions(-) base-commit: 93a198738e0aeb3193ca39c9f01f66060b3c4910 -- 2.46.0.rc1.232.g9752f9e123-goog