@@ -2017,6 +2017,8 @@ static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu)
#ifdef CONFIG_MEMFD_OPS
int kvm_memfd_invalidate_range(struct kvm *kvm, struct inode *inode,
unsigned long start, unsigned long end);
+int kvm_memfd_fallocate_range(struct kvm *kvm, struct inode *inode,
+ unsigned long start, unsigned long end);
#endif /* CONFIG_MEMFD_OPS */
@@ -891,15 +891,17 @@ static int kvm_init_mmu_notifier(struct kvm *kvm)
#endif /* CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER */
#ifdef CONFIG_MEMFD_OPS
-int kvm_memfd_invalidate_range(struct kvm *kvm, struct inode *inode,
- unsigned long start, unsigned long end)
+int kvm_memfd_handle_range(struct kvm *kvm, struct inode *inode,
+ unsigned long start, unsigned long end,
+ gfn_handler_t handler)
+
{
int ret;
const struct kvm_useraddr_range useraddr_range = {
.start = start,
.end = end,
.pte = __pte(0),
- .handler = kvm_unmap_gfn_range,
+ .handler = handler,
.on_lock = (void *)kvm_null_fn,
.flush_on_ret = true,
.may_block = false,
@@ -914,6 +916,20 @@ int kvm_memfd_invalidate_range(struct kvm *kvm, struct inode *inode,
return ret;
}
+
+int kvm_memfd_invalidate_range(struct kvm *kvm, struct inode *inode,
+ unsigned long start, unsigned long end)
+{
+ return kvm_memfd_handle_range(kvm, inode, start, end,
+ kvm_unmap_gfn_range);
+}
+
+int kvm_memfd_fallocate_range(struct kvm *kvm, struct inode *inode,
+ unsigned long start, unsigned long end)
+{
+ return kvm_memfd_handle_range(kvm, inode, start, end,
+ kvm_map_gfn_range);
+}
#endif /* CONFIG_MEMFD_OPS */
#ifdef CONFIG_HAVE_KVM_PM_NOTIFIER
@@ -23,6 +23,8 @@ static void memfd_invalidate_page_range(struct inode *inode, void *owner,
static void memfd_fallocate(struct inode *inode, void *owner,
pgoff_t start, pgoff_t end)
{
+ kvm_memfd_fallocate_range(owner, inode, start >> PAGE_SHIFT,
+ end >> PAGE_SHIFT);
}
static bool memfd_get_owner(void *owner)