diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2024-04-04 19:25:19 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2024-05-10 19:11:46 +0200 |
commit | fa30b0dc91c815b9579d6f758437c35db059f5ae (patch) | |
tree | 51acc6bd9c71c5e6c44dc2ccef09edd7bc46542e | |
parent | KVM: guest_memfd: pass error up from filemap_grab_folio (diff) | |
download | linux-fa30b0dc91c815b9579d6f758437c35db059f5ae.tar.xz linux-fa30b0dc91c815b9579d6f758437c35db059f5ae.zip |
KVM: guest_memfd: limit overzealous WARN
Because kvm_gmem_get_pfn() is called from the page fault path without
any of the slots_lock, filemap lock or mmu_lock taken, it is
possible for it to race with kvm_gmem_unbind(). This is not a
problem, as any PTE that is installed temporarily will be zapped
before the guest has the occasion to run.
However, it is not possible to have a complete unbind+bind
racing with the page fault, because deleting the memslot
will call synchronize_srcu_expedited() and wait for the
page fault to be resolved. Thus, we can still warn if
the file is there and is not the one we expect.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | virt/kvm/guest_memfd.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index c27828b0d42d..fd32288d0fbc 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -499,7 +499,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gmem = file->private_data; - if (WARN_ON_ONCE(xa_load(&gmem->bindings, index) != slot)) { + if (xa_load(&gmem->bindings, index) != slot) { + WARN_ON_ONCE(xa_load(&gmem->bindings, index)); r = -EIO; goto out_fput; } |