Lines Matching refs:vma
260 int handle_userfault(struct vm_area_struct *vma, unsigned long address, in handle_userfault() argument
263 struct mm_struct *mm = vma->vm_mm; in handle_userfault()
272 ctx = vma->vm_userfaultfd_ctx.ctx; in handle_userfault()
430 struct vm_area_struct *vma, *prev; in userfaultfd_release() local
447 for (vma = mm->mmap; vma; vma = vma->vm_next) { in userfaultfd_release()
449 BUG_ON(!!vma->vm_userfaultfd_ctx.ctx ^ in userfaultfd_release()
450 !!(vma->vm_flags & (VM_UFFD_MISSING | VM_UFFD_WP))); in userfaultfd_release()
451 if (vma->vm_userfaultfd_ctx.ctx != ctx) { in userfaultfd_release()
452 prev = vma; in userfaultfd_release()
455 new_flags = vma->vm_flags & ~(VM_UFFD_MISSING | VM_UFFD_WP); in userfaultfd_release()
456 prev = vma_merge(mm, prev, vma->vm_start, vma->vm_end, in userfaultfd_release()
457 new_flags, vma->anon_vma, in userfaultfd_release()
458 vma->vm_file, vma->vm_pgoff, in userfaultfd_release()
459 vma_policy(vma), in userfaultfd_release()
462 vma = prev; in userfaultfd_release()
464 prev = vma; in userfaultfd_release()
465 vma->vm_flags = new_flags; in userfaultfd_release()
466 vma->vm_userfaultfd_ctx = NULL_VM_UFFD_CTX; in userfaultfd_release()
721 struct vm_area_struct *vma, *prev, *cur; in userfaultfd_register() local
764 vma = find_vma_prev(mm, start, &prev); in userfaultfd_register()
767 if (!vma) in userfaultfd_register()
772 if (vma->vm_start >= end) in userfaultfd_register()
783 for (cur = vma; cur && cur->vm_start < end; cur = cur->vm_next) { in userfaultfd_register()
809 if (vma->vm_start < start) in userfaultfd_register()
810 prev = vma; in userfaultfd_register()
816 BUG_ON(vma->vm_ops); in userfaultfd_register()
817 BUG_ON(vma->vm_userfaultfd_ctx.ctx && in userfaultfd_register()
818 vma->vm_userfaultfd_ctx.ctx != ctx); in userfaultfd_register()
824 if (vma->vm_userfaultfd_ctx.ctx == ctx && in userfaultfd_register()
825 (vma->vm_flags & vm_flags) == vm_flags) in userfaultfd_register()
828 if (vma->vm_start > start) in userfaultfd_register()
829 start = vma->vm_start; in userfaultfd_register()
830 vma_end = min(end, vma->vm_end); in userfaultfd_register()
832 new_flags = (vma->vm_flags & ~vm_flags) | vm_flags; in userfaultfd_register()
834 vma->anon_vma, vma->vm_file, vma->vm_pgoff, in userfaultfd_register()
835 vma_policy(vma), in userfaultfd_register()
838 vma = prev; in userfaultfd_register()
841 if (vma->vm_start < start) { in userfaultfd_register()
842 ret = split_vma(mm, vma, start, 1); in userfaultfd_register()
846 if (vma->vm_end > end) { in userfaultfd_register()
847 ret = split_vma(mm, vma, end, 0); in userfaultfd_register()
857 vma->vm_flags = new_flags; in userfaultfd_register()
858 vma->vm_userfaultfd_ctx.ctx = ctx; in userfaultfd_register()
861 prev = vma; in userfaultfd_register()
862 start = vma->vm_end; in userfaultfd_register()
863 vma = vma->vm_next; in userfaultfd_register()
864 } while (vma && vma->vm_start < end); in userfaultfd_register()
885 struct vm_area_struct *vma, *prev, *cur; in userfaultfd_unregister() local
906 vma = find_vma_prev(mm, start, &prev); in userfaultfd_unregister()
909 if (!vma) in userfaultfd_unregister()
914 if (vma->vm_start >= end) in userfaultfd_unregister()
926 for (cur = vma; cur && cur->vm_start < end; cur = cur->vm_next) { in userfaultfd_unregister()
946 if (vma->vm_start < start) in userfaultfd_unregister()
947 prev = vma; in userfaultfd_unregister()
953 BUG_ON(vma->vm_ops); in userfaultfd_unregister()
959 if (!vma->vm_userfaultfd_ctx.ctx) in userfaultfd_unregister()
962 if (vma->vm_start > start) in userfaultfd_unregister()
963 start = vma->vm_start; in userfaultfd_unregister()
964 vma_end = min(end, vma->vm_end); in userfaultfd_unregister()
966 new_flags = vma->vm_flags & ~(VM_UFFD_MISSING | VM_UFFD_WP); in userfaultfd_unregister()
968 vma->anon_vma, vma->vm_file, vma->vm_pgoff, in userfaultfd_unregister()
969 vma_policy(vma), in userfaultfd_unregister()
972 vma = prev; in userfaultfd_unregister()
975 if (vma->vm_start < start) { in userfaultfd_unregister()
976 ret = split_vma(mm, vma, start, 1); in userfaultfd_unregister()
980 if (vma->vm_end > end) { in userfaultfd_unregister()
981 ret = split_vma(mm, vma, end, 0); in userfaultfd_unregister()
991 vma->vm_flags = new_flags; in userfaultfd_unregister()
992 vma->vm_userfaultfd_ctx = NULL_VM_UFFD_CTX; in userfaultfd_unregister()
995 prev = vma; in userfaultfd_unregister()
996 start = vma->vm_end; in userfaultfd_unregister()
997 vma = vma->vm_next; in userfaultfd_unregister()
998 } while (vma && vma->vm_start < end); in userfaultfd_unregister()