if (unlikely(!pte_same(entry, huge_ptep_get(ptep))))
                goto out_ptl;
 
+       /* Handle userfault-wp first, before trying to lock more pages */
+       if (userfaultfd_wp(vma) && huge_pte_uffd_wp(huge_ptep_get(ptep)) &&
+           (flags & FAULT_FLAG_WRITE) && !huge_pte_write(entry)) {
+               struct vm_fault vmf = {
+                       .vma = vma,
+                       .address = haddr,
+                       .real_address = address,
+                       .flags = flags,
+               };
+
+               spin_unlock(ptl);
+               if (pagecache_page) {
+                       unlock_page(pagecache_page);
+                       put_page(pagecache_page);
+               }
+               mutex_unlock(&hugetlb_fault_mutex_table[hash]);
+               i_mmap_unlock_read(mapping);
+               return handle_userfault(&vmf, VM_UFFD_WP);
+       }
+
        /*
         * hugetlb_wp() requires page locks of pte_page(entry) and
         * pagecache_page, so here we need take the former one