On Thu, Mar 09, 2023 at 05:37:10PM -0500, Peter Xu wrote: > This is a new feature that controls how uffd-wp handles none ptes. When > it's set, the kernel will handle anonymous memory the same way as file > memory, by allowing the user to wr-protect unpopulated ptes. [...] Hi, Andrew, Could you add a fixup to this patch as attached? It contains two comment changes suggested by David, and also a oneliner fix to khugepaged (to bail out anon thp collapsing when seeing pte markers). The latter one was something I spot only later on. Thanks, -- Peter Xu
>From 085596bc8913349cbeb3ec3303815f71f1a34d89 Mon Sep 17 00:00:00 2001 From: Peter Xu <peterx@xxxxxxxxxx> Date: Tue, 21 Mar 2023 16:09:26 -0400 Subject: [PATCH] fixup! mm/uffd: UFFD_FEATURE_WP_UNPOPULATED Signed-off-by: Peter Xu <peterx@xxxxxxxxxx> --- Documentation/admin-guide/mm/userfaultfd.rst | 2 +- mm/khugepaged.c | 2 +- mm/mprotect.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/mm/userfaultfd.rst b/Documentation/admin-guide/mm/userfaultfd.rst index 16843d5a4f65..7c304e432205 100644 --- a/Documentation/admin-guide/mm/userfaultfd.rst +++ b/Documentation/admin-guide/mm/userfaultfd.rst @@ -226,7 +226,7 @@ For anonymous memory, ``ioctl(UFFDIO_WRITEPROTECT)`` will ignore none ptes (e.g. when pages are missing and not populated). For file-backed memories like shmem and hugetlbfs, none ptes will be write protected just like a present pte. In other words, there will be a userfaultfd write fault -message generated when writting to a missing page on file typed memories, +message generated when writing to a missing page on file typed memories, as long as the page range was write-protected before. Such a message will not be generated on anonymous memories by default. diff --git a/mm/khugepaged.c b/mm/khugepaged.c index bdde0a02811b..2a5372c49b82 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1283,7 +1283,7 @@ static int hpage_collapse_scan_pmd(struct mm_struct *mm, * enabled swap entries. Please see * comment below for pte_uffd_wp(). */ - if (pte_swp_uffd_wp(pteval)) { + if (pte_swp_uffd_wp_any(pteval)) { result = SCAN_PTE_UFFD_WP; goto out_unmap; } diff --git a/mm/mprotect.c b/mm/mprotect.c index e27bbd0fde6f..b9da9a5f87fe 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -329,8 +329,8 @@ static inline int pmd_none_or_clear_bad_unless_trans_huge(pmd_t *pmd) } /* - * Return true if we want to split huge thps in change protection - * procedure, false otherwise. + * Return true if we want to split THPs into PTE mappings in change + * protection procedure, false otherwise. */ static inline bool pgtable_split_needed(struct vm_area_struct *vma, unsigned long cp_flags) -- 2.39.1