When a GFN range is entirely private, it's unnecessary for kvm_handle_hva_range() to invoke handlers for the GFN range, because 1) the gfn_range.attr_filter for the handler is KVM_FILTER_SHARED, which is for shared mappings only; 2) KVM has already zapped all shared mappings before setting the memory attribute to private. This can avoid unnecessary zaps on private mappings for VMs of type KVM_X86_SW_PROTECTED_VM, e.g., during auto numa balancing scans of VMAs. Signed-off-by: Yan Zhao --- virt/kvm/kvm_main.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f769d1dccc21..e615ad405ce4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -620,6 +620,17 @@ static __always_inline kvm_mn_ret_t kvm_handle_hva_range(struct kvm *kvm, gfn_range.slot = slot; gfn_range.lockless = range->lockless; +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + /* + * If GFN range are all private, no need to invoke the + * handler. + */ + if (kvm_range_has_memory_attributes(kvm, gfn_range.start, + gfn_range.end, ~0, + KVM_MEMORY_ATTRIBUTE_PRIVATE)) + continue; +#endif + if (!r.found_memslot) { r.found_memslot = true; if (!range->lockless) { -- 2.43.2