From: Oscar Salvador <osalvador@suse.de>
To: David Hildenbrand <david@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Muchun Song <muchun.song@linux.dev>,
James Houghton <jthoughton@google.com>,
Peter Xu <peterx@redhat.com>, Gavin Guo <gavinguo@igalia.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/5] mm,hugetlb: Document the reason to lock the folio in the faulting path
Date: Fri, 13 Jun 2025 23:47:50 +0200 [thread overview]
Message-ID: <aEychl8ZkJDG1-5K@localhost.localdomain> (raw)
In-Reply-To: <ffeeb3d2-0e45-43d1-b2e1-a55f09b160f5@redhat.com>
On Fri, Jun 13, 2025 at 09:57:23PM +0200, David Hildenbrand wrote:
> What I meant is:
>
> Assume we have a pagecache page mapped into our page tables R/O (MAP_PRIVATE
> mapping).
>
> During a write fault on such a pagecache page, we end up in
> do_wp_page()->wp_page_copy() we perform the copy via __wp_page_copy_user()
> without the folio lock.
Yes, it would be similar to doing
hugetlb_fault()->hugetlb_no_page() which would map it R/O.
Then, if we write to it, we will go to hugetlb_wp().
Since it is a private mapping, we would only need to lock the folio to
see if we can re-use it (the wp_can_reuse_anon_folio() analog to
hugetlb).
> In wp_page_copy(), we retake the pt lock, to make sure that the page is
> still mapped (pte_same). If the page is no longer mapped, we retry the
> fault.
>
> In that case, we only want to make sure that the folio is still mapped after
> possibly dropping the page table lock in between.
>
> As we are holding an additional folio reference in
> do_wp_page()->wp_page_copy(), the folio cannot get freed concurrently.
>
>
> There is indeed the do_cow_fault() path where we avoid faulting in the
> pagecache page in the first place. So no page table reference, an I can
> understand why we would need the folio lock there.
But do_cow_fault() does take a reference via __do_fault()->filemap_fault().
> Regarding hugetlb_no_page(): I think we could drop the folio lock for a
> pagecache folio after inserting the folio into the page table. Just like
> do_wp_page()->wp_page_copy(), we would have to verify again under PTL if the
> folio is still mapped
>
> ... which we already do through pte_same() checks?
But that is somewhat similar what we do in the generic faulting path.
Assume you fault in a file for a private mapping and do COW.
So, do_pte_missing()->do_fault()->do_cow_fault().
do_cow_fault()->__do_fault() will a) get a reference and b) lock the folio.
And then we will proceed with copying the file to the page we will map privately.
This would be something like hugetlb_fault()->hugetlb_no_page()->hugetlb_wp().
So we have to hold the lock throughout hugetlb_wp() for file pages we are copying
to private mappings.
Now, let us assume you map the file R/O. And after a while you write-fault to it.
In the generic faulting path, that will go through:
do_pte_missing()->do_fault()->do_read_fault()
do_wp_page()->wp_page_copy()
wp_page_copy(), which indeed doesn't hold the lock (but takes a reference).
Maybe it's because it's Friday, but I'm confused as to why
do_pte_missing()->do_fault()->do_cow_fault() holds the lock while do_wp_page() doesn't
although it might the file's page we have to copy.
--
Oscar Salvador
SUSE Labs
next prev parent reply other threads:[~2025-06-13 21:47 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-12 13:46 [PATCH 0/5] Misc rework on hugetlb_fault Oscar Salvador
2025-06-12 13:46 ` [PATCH 1/5] mm,hugetlb: Change mechanism to detect a COW on private mapping Oscar Salvador
2025-06-13 13:52 ` David Hildenbrand
2025-06-12 13:46 ` [PATCH 2/5] mm,hugetlb: Document the reason to lock the folio in the faulting path Oscar Salvador
2025-06-13 13:56 ` David Hildenbrand
2025-06-13 14:23 ` Oscar Salvador
2025-06-13 19:57 ` David Hildenbrand
2025-06-13 21:47 ` Oscar Salvador [this message]
2025-06-14 9:07 ` Oscar Salvador
2025-06-16 9:22 ` David Hildenbrand
2025-06-16 14:10 ` Oscar Salvador
2025-06-16 14:41 ` David Hildenbrand
2025-06-17 10:03 ` Oscar Salvador
2025-06-17 11:27 ` David Hildenbrand
2025-06-17 12:04 ` Oscar Salvador
2025-06-17 12:08 ` David Hildenbrand
2025-06-17 12:10 ` Oscar Salvador
2025-06-17 12:50 ` Oscar Salvador
2025-06-17 13:42 ` David Hildenbrand
2025-06-17 14:00 ` Oscar Salvador
2025-06-19 11:52 ` Oscar Salvador
2025-06-12 13:46 ` [PATCH 3/5] mm,hugetlb: Conver anon_rmap into boolean Oscar Salvador
2025-06-13 13:48 ` David Hildenbrand
2025-06-12 13:47 ` [PATCH 4/5] mm,hugetlb: Drop obsolete comment about non-present pte and second faults Oscar Salvador
2025-06-12 13:47 ` [PATCH 5/5] mm,hugetlb: Drop unlikelys from hugetlb_fault Oscar Salvador
2025-06-13 8:55 ` [PATCH 0/5] Misc rework on hugetlb_fault Oscar Salvador
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=aEychl8ZkJDG1-5K@localhost.localdomain \
--to=osalvador@suse.de \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=gavinguo@igalia.com \
--cc=jthoughton@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=muchun.song@linux.dev \
--cc=peterx@redhat.com \
/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.