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
