From: Peter Xu <peterx@redhat.com>
To: linux-kernel@vger.kernel.org, linux-mm@kvack.org
Cc: Axel Rasmussen <axelrasmussen@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@redhat.com>,
peterx@redhat.com, Mike Kravetz <mike.kravetz@oracle.com>,
Nadav Amit <nadav.amit@gmail.com>,
Andrea Arcangeli <aarcange@redhat.com>,
linux-stable <stable@vger.kernel.org>
Subject: [PATCH 2/6] mm/hugetlb: Fix uffd-wp bit lost when unsharing happens
Date: Thu, 13 Apr 2023 19:11:16 -0400 [thread overview]
Message-ID: <20230413231120.544685-3-peterx@redhat.com> (raw)
In-Reply-To: <20230413231120.544685-1-peterx@redhat.com>
When we try to unshare a pinned page for a private hugetlb, uffd-wp bit can
get lost during unsharing. Fix it by carrying it over.
This should be very rare, only if an unsharing happened on a private
hugetlb page with uffd-wp protected (e.g. in a child which shares the same
page with parent with UFFD_FEATURE_EVENT_FORK enabled).
Cc: linux-stable <stable@vger.kernel.org>
Fixes: 166f3ecc0daf ("mm/hugetlb: hook page faults for uffd write protection")
Reported-by: Mike Kravetz <mike.kravetz@oracle.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
mm/hugetlb.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 7320e64aacc6..083aae35bff8 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -5637,13 +5637,16 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma,
spin_lock(ptl);
ptep = hugetlb_walk(vma, haddr, huge_page_size(h));
if (likely(ptep && pte_same(huge_ptep_get(ptep), pte))) {
+ pte_t newpte = make_huge_pte(vma, &new_folio->page, !unshare);
+
/* Break COW or unshare */
huge_ptep_clear_flush(vma, haddr, ptep);
mmu_notifier_invalidate_range(mm, range.start, range.end);
page_remove_rmap(old_page, vma, true);
hugepage_add_new_anon_rmap(new_folio, vma, haddr);
- set_huge_pte_at(mm, haddr, ptep,
- make_huge_pte(vma, &new_folio->page, !unshare));
+ if (huge_pte_uffd_wp(pte))
+ newpte = huge_pte_mkuffd_wp(newpte);
+ set_huge_pte_at(mm, haddr, ptep, newpte);
folio_set_hugetlb_migratable(new_folio);
/* Make the old page be freed below */
new_folio = page_folio(old_page);
--
2.39.1
next prev parent reply other threads:[~2023-04-13 23:12 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-13 23:11 [PATCH 0/6] mm/hugetlb: More fixes around uffd-wp vs fork() / RO pins Peter Xu
2023-04-13 23:11 ` [PATCH 1/6] mm/hugetlb: Fix uffd-wp during fork() Peter Xu
2023-04-14 9:37 ` David Hildenbrand
2023-04-14 9:45 ` Mika Penttilä
2023-04-14 14:09 ` Peter Xu
2023-04-14 14:23 ` Mika Penttilä
2023-04-14 15:21 ` Peter Xu
2023-04-14 22:17 ` Mike Kravetz
2023-04-13 23:11 ` Peter Xu [this message]
2023-04-14 9:23 ` [PATCH 2/6] mm/hugetlb: Fix uffd-wp bit lost when unsharing happens David Hildenbrand
2023-04-14 22:19 ` Mike Kravetz
2023-04-13 23:11 ` [PATCH 3/6] selftests/mm: Add a few options for uffd-unit-test Peter Xu
2023-04-13 23:11 ` [PATCH 4/6] selftests/mm: Extend and rename uffd pagemap test Peter Xu
2023-04-13 23:11 ` [PATCH 5/6] selftests/mm: Rename COW_EXTRA_LIBS to IOURING_EXTRA_LIBS Peter Xu
2023-04-14 9:52 ` David Hildenbrand
2023-04-14 13:56 ` Peter Xu
2023-04-14 14:29 ` David Hildenbrand
2023-04-13 23:12 ` [PATCH 6/6] selftests/mm: Add tests for RO pinning vs fork() Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230413231120.544685-3-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mike.kravetz@oracle.com \
--cc=nadav.amit@gmail.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.