ARM: dts: stm32: add UBSH EHCI and OHCI support on stm32mp131
[platform/kernel/linux-starfive.git] / mm / userfaultfd.c
index 7327b25..e24e8a4 100644 (file)
@@ -243,20 +243,22 @@ static int mcontinue_atomic_pte(struct mm_struct *dst_mm,
 {
        struct inode *inode = file_inode(dst_vma->vm_file);
        pgoff_t pgoff = linear_page_index(dst_vma, dst_addr);
+       struct folio *folio;
        struct page *page;
        int ret;
 
-       ret = shmem_getpage(inode, pgoff, &page, SGP_NOALLOC);
-       /* Our caller expects us to return -EFAULT if we failed to find page. */
+       ret = shmem_get_folio(inode, pgoff, &folio, SGP_NOALLOC);
+       /* Our caller expects us to return -EFAULT if we failed to find folio */
        if (ret == -ENOENT)
                ret = -EFAULT;
        if (ret)
                goto out;
-       if (!page) {
+       if (!folio) {
                ret = -EFAULT;
                goto out;
        }
 
+       page = folio_file_page(folio, pgoff);
        if (PageHWPoison(page)) {
                ret = -EIO;
                goto out_release;
@@ -267,13 +269,13 @@ static int mcontinue_atomic_pte(struct mm_struct *dst_mm,
        if (ret)
                goto out_release;
 
-       unlock_page(page);
+       folio_unlock(folio);
        ret = 0;
 out:
        return ret;
 out_release:
-       unlock_page(page);
-       put_page(page);
+       folio_unlock(folio);
+       folio_put(folio);
        goto out;
 }
 
@@ -377,30 +379,30 @@ retry:
                BUG_ON(dst_addr >= dst_start + len);
 
                /*
-                * Serialize via i_mmap_rwsem and hugetlb_fault_mutex.
-                * i_mmap_rwsem ensures the dst_pte remains valid even
+                * Serialize via vma_lock and hugetlb_fault_mutex.
+                * vma_lock ensures the dst_pte remains valid even
                 * in the case of shared pmds.  fault mutex prevents
                 * races with other faulting threads.
                 */
-               mapping = dst_vma->vm_file->f_mapping;
-               i_mmap_lock_read(mapping);
                idx = linear_page_index(dst_vma, dst_addr);
+               mapping = dst_vma->vm_file->f_mapping;
                hash = hugetlb_fault_mutex_hash(mapping, idx);
                mutex_lock(&hugetlb_fault_mutex_table[hash]);
+               hugetlb_vma_lock_read(dst_vma);
 
                err = -ENOMEM;
                dst_pte = huge_pte_alloc(dst_mm, dst_vma, dst_addr, vma_hpagesize);
                if (!dst_pte) {
+                       hugetlb_vma_unlock_read(dst_vma);
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
-                       i_mmap_unlock_read(mapping);
                        goto out_unlock;
                }
 
                if (mode != MCOPY_ATOMIC_CONTINUE &&
                    !huge_pte_none_mostly(huge_ptep_get(dst_pte))) {
                        err = -EEXIST;
+                       hugetlb_vma_unlock_read(dst_vma);
                        mutex_unlock(&hugetlb_fault_mutex_table[hash]);
-                       i_mmap_unlock_read(mapping);
                        goto out_unlock;
                }
 
@@ -408,8 +410,8 @@ retry:
                                               dst_addr, src_addr, mode, &page,
                                               wp_copy);
 
+               hugetlb_vma_unlock_read(dst_vma);
                mutex_unlock(&hugetlb_fault_mutex_table[hash]);
-               i_mmap_unlock_read(mapping);
 
                cond_resched();