From: Ackerley Tng <[email protected]>

__kvm_gmem_invalidate_begin() and __kvm_gmem_invalidate_end() actually do
not specially handle -1ul. -1ul is used as a huge number, which legal
indices do not exceed, and hence the invalidation works as expected.

Since a later patch is going to make use of the exact range, calculate the
size of the guest_memfd inode and use it as the end range for invalidating
SPTEs.

Signed-off-by: Ackerley Tng <[email protected]>
---
 virt/kvm/guest_memfd.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index 18dec87dd4baa..a8a5e37c982a4 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -376,6 +376,7 @@ static int kvm_gmem_release(struct inode *inode, struct 
file *file)
        struct kvm_memory_slot *slot;
        struct kvm *kvm = f->kvm;
        unsigned long index;
+       pgoff_t end;
 
        /*
         * Prevent concurrent attempts to *unbind* a memslot.  This is the last
@@ -402,9 +403,10 @@ static int kvm_gmem_release(struct inode *inode, struct 
file *file)
         * Zap all SPTEs pointed at by this file.  Do not free the backing
         * memory, as its lifetime is associated with the inode, not the file.
         */
-       __kvm_gmem_invalidate_begin(f, 0, -1ul,
+       end = i_size_read(inode) >> PAGE_SHIFT;
+       __kvm_gmem_invalidate_begin(f, 0, end,
                                    kvm_gmem_get_invalidate_filter(inode));
-       __kvm_gmem_invalidate_end(f, 0, -1ul);
+       __kvm_gmem_invalidate_end(f, 0, end);
 
        list_del(&f->entry);
 

-- 
2.54.0.545.g6539524ca2-goog



Reply via email to