mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
mm/userfaultfd: allow pte_offset_map_lock() to fail
mfill_atomic_install_pte() and mfill_atomic_pte_zeropage() treat failed pte_offset_map_lock() as -EAGAIN, which mfill_atomic() already returns to user for a similar race. Link: https://lkml.kernel.org/r/50cf3930-1bfa-4de9-a079-3da47b7ce17b@google.com Signed-off-by: Hugh Dickins <hughd@google.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Axel Rasmussen <axelrasmussen@google.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Christoph Hellwig <hch@infradead.org> Cc: David Hildenbrand <david@redhat.com> Cc: "Huang, Ying" <ying.huang@intel.com> Cc: Ira Weiny <ira.weiny@intel.com> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Lorenzo Stoakes <lstoakes@gmail.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Naoya Horiguchi <naoya.horiguchi@nec.com> Cc: Pavel Tatashin <pasha.tatashin@soleen.com> Cc: Peter Xu <peterx@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Qi Zheng <zhengqi.arch@bytedance.com> Cc: Ralph Campbell <rcampbell@nvidia.com> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: SeongJae Park <sj@kernel.org> Cc: Song Liu <song@kernel.org> Cc: Steven Price <steven.price@arm.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> Cc: Will Deacon <will@kernel.org> Cc: Yang Shi <shy828301@gmail.com> Cc: Yu Zhao <yuzhao@google.com> Cc: Zack Rusin <zackr@vmware.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
2b683a4ff6
commit
3622d3cde3
|
@ -76,7 +76,10 @@ int mfill_atomic_install_pte(pmd_t *dst_pmd,
|
||||||
if (flags & MFILL_ATOMIC_WP)
|
if (flags & MFILL_ATOMIC_WP)
|
||||||
_dst_pte = pte_mkuffd_wp(_dst_pte);
|
_dst_pte = pte_mkuffd_wp(_dst_pte);
|
||||||
|
|
||||||
|
ret = -EAGAIN;
|
||||||
dst_pte = pte_offset_map_lock(dst_mm, dst_pmd, dst_addr, &ptl);
|
dst_pte = pte_offset_map_lock(dst_mm, dst_pmd, dst_addr, &ptl);
|
||||||
|
if (!dst_pte)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (vma_is_shmem(dst_vma)) {
|
if (vma_is_shmem(dst_vma)) {
|
||||||
/* serialize against truncate with the page table lock */
|
/* serialize against truncate with the page table lock */
|
||||||
|
@ -121,6 +124,7 @@ int mfill_atomic_install_pte(pmd_t *dst_pmd,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out_unlock:
|
out_unlock:
|
||||||
pte_unmap_unlock(dst_pte, ptl);
|
pte_unmap_unlock(dst_pte, ptl);
|
||||||
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +216,10 @@ static int mfill_atomic_pte_zeropage(pmd_t *dst_pmd,
|
||||||
|
|
||||||
_dst_pte = pte_mkspecial(pfn_pte(my_zero_pfn(dst_addr),
|
_dst_pte = pte_mkspecial(pfn_pte(my_zero_pfn(dst_addr),
|
||||||
dst_vma->vm_page_prot));
|
dst_vma->vm_page_prot));
|
||||||
|
ret = -EAGAIN;
|
||||||
dst_pte = pte_offset_map_lock(dst_vma->vm_mm, dst_pmd, dst_addr, &ptl);
|
dst_pte = pte_offset_map_lock(dst_vma->vm_mm, dst_pmd, dst_addr, &ptl);
|
||||||
|
if (!dst_pte)
|
||||||
|
goto out;
|
||||||
if (dst_vma->vm_file) {
|
if (dst_vma->vm_file) {
|
||||||
/* the shmem MAP_PRIVATE case requires checking the i_size */
|
/* the shmem MAP_PRIVATE case requires checking the i_size */
|
||||||
inode = dst_vma->vm_file->f_inode;
|
inode = dst_vma->vm_file->f_inode;
|
||||||
|
@ -231,6 +238,7 @@ static int mfill_atomic_pte_zeropage(pmd_t *dst_pmd,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out_unlock:
|
out_unlock:
|
||||||
pte_unmap_unlock(dst_pte, ptl);
|
pte_unmap_unlock(dst_pte, ptl);
|
||||||
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue