提交 fed15f13 编写于 作者: P Peter Xu 提交者: Andrew Morton

mm/hugetlb: pre-allocate pgtable pages for uffd wr-protects

Userfaultfd-wp uses pte markers to mark wr-protected pages for both shmem
and hugetlb.  Shmem has pre-allocation ready for markers, but hugetlb path
was overlooked.

Doing so by calling huge_pte_alloc() if the initial pgtable walk fails to
find the huge ptep.  It's possible that huge_pte_alloc() can fail with
high memory pressure, in that case stop the loop immediately and fail
silently.  This is not the most ideal solution but it matches with what we
do with shmem meanwhile it avoids the splat in dmesg.

Link: https://lkml.kernel.org/r/20230104225207.1066932-2-peterx@redhat.com
Fixes: 60dfaad6 ("mm/hugetlb: allow uffd wr-protect none ptes")
Signed-off-by: NPeter Xu <peterx@redhat.com>
Reported-by: NJames Houghton <jthoughton@google.com>
Reviewed-by: NMike Kravetz <mike.kravetz@oracle.com>
Acked-by: NDavid Hildenbrand <david@redhat.com>
Acked-by: NJames Houghton <jthoughton@google.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Cc: Nadav Amit <nadav.amit@gmail.com>
Cc: <stable@vger.kernel.org>	[5.19+]
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
上级 b30c14cd
...@@ -6660,9 +6660,18 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma, ...@@ -6660,9 +6660,18 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
spinlock_t *ptl; spinlock_t *ptl;
ptep = huge_pte_offset(mm, address, psize); ptep = huge_pte_offset(mm, address, psize);
if (!ptep) { if (!ptep) {
if (!uffd_wp) {
address |= last_addr_mask; address |= last_addr_mask;
continue; continue;
} }
/*
* Userfaultfd wr-protect requires pgtable
* pre-allocations to install pte markers.
*/
ptep = huge_pte_alloc(mm, vma, address, psize);
if (!ptep)
break;
}
ptl = huge_pte_lock(h, mm, ptep); ptl = huge_pte_lock(h, mm, ptep);
if (huge_pmd_unshare(mm, vma, address, ptep)) { if (huge_pmd_unshare(mm, vma, address, ptep)) {
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册