[PATCH RFC 03/10] KVM: guest_memfd: Avoid conditional mmu_lock acquisition
From: Marco Elver
Date: Thu Sep 10 2026 - 12:47:13 EST
Refactor __kvm_gmem_invalidate_start() to check for present bindings
upfront via xa_find() instead of tracking found memslots inside the
range iteration with a 'found_memslot' flag and conditionally acquiring
and releasing KVM's mmu_lock.
Eliminating the conditional locking inside the loop simplifies control
flow, ensures lock scoping is straightforward, and subsequently allows
Clang context analysis to verify that mmu_lock is held unconditionally
across kvm_mmu_unmap_gfn_range().
No functional change intended.
Signed-off-by: Marco Elver <elver@xxxxxxxxxx>
---
virt/kvm/guest_memfd.c | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index 625e62e1a031..896f3b076562 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -124,10 +124,16 @@ static void __kvm_gmem_invalidate_start(struct gmem_file *f, pgoff_t start,
pgoff_t end,
enum kvm_gfn_range_filter attr_filter)
{
- bool flush = false, found_memslot = false;
+ bool flush = false;
struct kvm_memory_slot *slot;
struct kvm *kvm = f->kvm;
- unsigned long index;
+ pgoff_t index = start;
+
+ if (!xa_find(&f->bindings, &index, end - 1, XA_PRESENT))
+ return;
+
+ KVM_MMU_LOCK(kvm);
+ kvm_mmu_invalidate_start(kvm);
xa_for_each_range(&f->bindings, index, slot, start, end - 1) {
pgoff_t pgoff = slot->gmem.pgoff;
@@ -140,13 +146,6 @@ static void __kvm_gmem_invalidate_start(struct gmem_file *f, pgoff_t start,
.attr_filter = attr_filter,
};
- if (!found_memslot) {
- found_memslot = true;
-
- KVM_MMU_LOCK(kvm);
- kvm_mmu_invalidate_start(kvm);
- }
-
flush |= kvm_mmu_unmap_gfn_range(kvm, &gfn_range);
#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE
@@ -157,8 +156,7 @@ static void __kvm_gmem_invalidate_start(struct gmem_file *f, pgoff_t start,
if (flush)
kvm_flush_remote_tlbs(kvm);
- if (found_memslot)
- KVM_MMU_UNLOCK(kvm);
+ KVM_MMU_UNLOCK(kvm);
}
static void kvm_gmem_invalidate_start(struct inode *inode, pgoff_t start,
--
2.55.0.1003.g10538fe699-goog