Add support for sending a pagefault event if userfaultfd is registered.
Only page missing event is currently supported.

Signed-off-by: Nikita Kalyazin <kalya...@amazon.com>
---
 virt/kvm/guest_memfd.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index af825f7494ea..358c3776ed66 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -4,6 +4,9 @@
 #include <linux/kvm_host.h>
 #include <linux/pagemap.h>
 #include <linux/anon_inodes.h>
+#ifdef CONFIG_KVM_PRIVATE_MEM
+#include <linux/userfaultfd_k.h>
+#endif /* CONFIG_KVM_PRIVATE_MEM */
 
 #include "kvm_mm.h"
 
@@ -332,9 +335,16 @@ static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf)
        struct folio *folio;
        vm_fault_t ret = VM_FAULT_LOCKED;
 
+       folio = filemap_get_entry(inode->i_mapping, vmf->pgoff);
+       if (!folio && userfaultfd_missing(vmf->vma))
+               return handle_userfault(vmf, VM_UFFD_MISSING);
+       if (folio)
+               folio_lock(folio);
+
        filemap_invalidate_lock_shared(inode->i_mapping);
 
-       folio = kvm_gmem_get_folio(inode, vmf->pgoff);
+       if (!folio)
+               folio = kvm_gmem_get_folio(inode, vmf->pgoff);
        if (IS_ERR(folio)) {
                switch (PTR_ERR(folio)) {
                case -EAGAIN:
-- 
2.47.1


Reply via email to