mm/hugetlb: take care of UFFDIO_COPY_MODE_WP
[linux-2.6-microblaze.git] / mm / userfaultfd.c
index 2b6ec33..be2a61f 100644 (file)
@@ -305,7 +305,8 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
                                              unsigned long dst_start,
                                              unsigned long src_start,
                                              unsigned long len,
-                                             enum mcopy_atomic_mode mode)
+                                             enum mcopy_atomic_mode mode,
+                                             bool wp_copy)
 {
        int vm_shared = dst_vma->vm_flags & VM_SHARED;
        ssize_t err;
@@ -393,7 +394,7 @@ retry:
                }
 
                if (mode != MCOPY_ATOMIC_CONTINUE &&
-                   !huge_pte_none(huge_ptep_get(dst_pte))) {
+                   !huge_pte_none_mostly(huge_ptep_get(dst_pte))) {
                        err = -EEXIST;
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
                        i_mmap_unlock_read(mapping);
@@ -401,7 +402,8 @@ retry:
                }
 
                err = hugetlb_mcopy_atomic_pte(dst_mm, dst_pte, dst_vma,
-                                              dst_addr, src_addr, mode, &page);
+                                              dst_addr, src_addr, mode, &page,
+                                              wp_copy);
 
                mutex_unlock(&hugetlb_fault_mutex_table[hash]);
                i_mmap_unlock_read(mapping);
@@ -456,7 +458,8 @@ extern ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
                                      unsigned long dst_start,
                                      unsigned long src_start,
                                      unsigned long len,
-                                     enum mcopy_atomic_mode mode);
+                                     enum mcopy_atomic_mode mode,
+                                     bool wp_copy);
 #endif /* CONFIG_HUGETLB_PAGE */
 
 static __always_inline ssize_t mfill_atomic_pte(struct mm_struct *dst_mm,
@@ -576,7 +579,8 @@ retry:
         */
        if (is_vm_hugetlb_page(dst_vma))
                return  __mcopy_atomic_hugetlb(dst_mm, dst_vma, dst_start,
-                                               src_start, len, mcopy_mode);
+                                              src_start, len, mcopy_mode,
+                                              wp_copy);
 
        if (!vma_is_anonymous(dst_vma) && !vma_is_shmem(dst_vma))
                goto out_unlock;