From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Hongfu Li <hongfu.li@linux.dev>
Cc: akpm@linux-foundation.org, david@kernel.org, liam@infradead.org,
vbabka@kernel.org, rppt@kernel.org, surenb@google.com,
mhocko@suse.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, Hongfu Li <lihongfu@kylinos.cn>
Subject: Re: [PATCH v2 2/2] mm: Extract non-swap page handling to do_non_swap_page()
Date: Mon, 27 Jul 2026 17:30:51 +0100 [thread overview]
Message-ID: <ameHdtnC4BxjgQGL@lucifer> (raw)
In-Reply-To: <20260723030752.16979-3-hongfu.li@linux.dev>
On Thu, Jul 23, 2026 at 11:07:52AM +0800, Hongfu Li wrote:
> From: Hongfu Li <lihongfu@kylinos.cn>
>
> Factor non-swap entry logic out of bloated do_swap_page() to simplify
> the main swap fault flow and improve readability.
>
> The new do_non_swap_page() handles migration, device private/exclusive,
> hwpoison, marker and bad PTE entries.
>
> Signed-off-by: Hongfu Li <lihongfu@kylinos.cn>
We've already gone over this elsewhere in the thread, we don't want a
do_non_swap_page() (HELL no).
But in general I want to finish what I started with softleaves, which still has
some work to do with swap entries so maybe could you just drop this patch so I
can follow up with that later?
That way you can do a respin of just the 1/2 as a v3.
Thanks, Lorenzo
> ---
> mm/memory.c | 120 ++++++++++++++++++++++++++++++----------------------
> 1 file changed, 69 insertions(+), 51 deletions(-)
>
> diff --git a/mm/memory.c b/mm/memory.c
> index ae521baa8c84..50d8e92aef91 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -4815,6 +4815,74 @@ static void check_swap_exclusive(struct folio *folio, swp_entry_t entry,
> } while (--nr_pages);
> }
>
> +static vm_fault_t do_non_swap_page(struct vm_fault *vmf)
> +{
> + struct vm_area_struct *vma = vmf->vma;
> + struct folio *folio;
> + softleaf_t entry;
> + vm_fault_t ret = 0;
> +
> + entry = softleaf_from_pte(vmf->orig_pte);
> + if (softleaf_is_migration(entry)) {
> + migration_entry_wait(vma->vm_mm, vmf->pmd,
> + vmf->address);
> + } else if (softleaf_is_device_exclusive(entry)) {
> + vmf->page = softleaf_to_page(entry);
> + ret = remove_device_exclusive_entry(vmf);
> + } else if (softleaf_is_device_private(entry)) {
> +
> + if (vmf->flags & FAULT_FLAG_VMA_LOCK) {
> + /*
> + * migrate_to_ram is not yet ready to operate
> + * under VMA lock.
> + */
> + vma_end_read(vma);
> + return VM_FAULT_RETRY;
> + }
> +
> + vmf->page = softleaf_to_page(entry);
> + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd,
> + vmf->address, &vmf->ptl);
> + if (unlikely(!vmf->pte ||
> + !pte_same(ptep_get(vmf->pte),
> + vmf->orig_pte)))
> + goto unlock;
> +
> + /*
> + * Get a folio reference while we know the folio can't be
> + * freed.
> + */
> + folio = page_folio(vmf->page);
> + if (folio_trylock(folio)) {
> + struct dev_pagemap *pgmap;
> +
> + folio_get(folio);
> + pte_unmap_unlock(vmf->pte, vmf->ptl);
> + pgmap = page_pgmap(vmf->page);
> + ret = pgmap->ops->migrate_to_ram(vmf);
> + folio_unlock(folio);
> + folio_put(folio);
> + } else {
> + pte_unmap(vmf->pte);
> + softleaf_entry_wait_on_locked(entry, vmf->ptl);
> + }
> + } else if (softleaf_is_hwpoison(entry)) {
> + ret = VM_FAULT_HWPOISON;
> + } else if (softleaf_is_marker(entry)) {
> + ret = handle_pte_marker(vmf);
> + } else {
> + print_bad_pte(vma, vmf->address, vmf->orig_pte, NULL);
> + ret = VM_FAULT_SIGBUS;
> + }
> +
> + return ret;
> +
> +unlock:
> + if (vmf->pte)
> + pte_unmap_unlock(vmf->pte, vmf->ptl);
> + return ret;
> +}
> +
> /*
> * We enter with either the VMA lock or the mmap_lock held (see
> * FAULT_FLAG_VMA_LOCK), and pte mapped but not yet locked.
> @@ -4845,57 +4913,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
>
> entry = softleaf_from_pte(vmf->orig_pte);
> if (unlikely(!softleaf_is_swap(entry))) {
> - if (softleaf_is_migration(entry)) {
> - migration_entry_wait(vma->vm_mm, vmf->pmd,
> - vmf->address);
> - } else if (softleaf_is_device_exclusive(entry)) {
> - vmf->page = softleaf_to_page(entry);
> - ret = remove_device_exclusive_entry(vmf);
> - } else if (softleaf_is_device_private(entry)) {
> - if (vmf->flags & FAULT_FLAG_VMA_LOCK) {
> - /*
> - * migrate_to_ram is not yet ready to operate
> - * under VMA lock.
> - */
> - vma_end_read(vma);
> - ret = VM_FAULT_RETRY;
> - goto out;
> - }
> -
> - vmf->page = softleaf_to_page(entry);
> - vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd,
> - vmf->address, &vmf->ptl);
> - if (unlikely(!vmf->pte ||
> - !pte_same(ptep_get(vmf->pte),
> - vmf->orig_pte)))
> - goto unlock;
> -
> - /*
> - * Get a folio reference while we know the folio can't be
> - * freed.
> - */
> - folio = page_folio(vmf->page);
> - if (folio_trylock(folio)) {
> - struct dev_pagemap *pgmap;
> -
> - folio_get(folio);
> - pte_unmap_unlock(vmf->pte, vmf->ptl);
> - pgmap = page_pgmap(vmf->page);
> - ret = pgmap->ops->migrate_to_ram(vmf);
> - folio_unlock(folio);
> - folio_put(folio);
> - } else {
> - pte_unmap(vmf->pte);
> - softleaf_entry_wait_on_locked(entry, vmf->ptl);
> - }
> - } else if (softleaf_is_hwpoison(entry)) {
> - ret = VM_FAULT_HWPOISON;
> - } else if (softleaf_is_marker(entry)) {
> - ret = handle_pte_marker(vmf);
> - } else {
> - print_bad_pte(vma, vmf->address, vmf->orig_pte, NULL);
> - ret = VM_FAULT_SIGBUS;
> - }
> + ret = do_non_swap_page(vmf);
> goto out;
> }
>
> --
> 2.54.0
>
prev parent reply other threads:[~2026-07-27 16:31 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-23 3:07 [PATCH v2 0/2] mm: folio conversion and refactoring in do_swap_page() Hongfu Li
2026-07-23 3:07 ` [PATCH v2 1/2] mm: Use a folio in the softleaf_is_device_private path Hongfu Li
2026-07-27 16:29 ` Lorenzo Stoakes (ARM)
2026-07-23 3:07 ` [PATCH v2 2/2] mm: Extract non-swap page handling to do_non_swap_page() Hongfu Li
2026-07-24 19:33 ` David Hildenbrand (Arm)
2026-07-27 12:10 ` Hongfu Li
2026-07-27 12:16 ` David Hildenbrand (Arm)
2026-07-27 13:58 ` Lorenzo Stoakes (ARM)
2026-07-27 16:30 ` Lorenzo Stoakes (ARM) [this message]
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=ameHdtnC4BxjgQGL@lucifer \
--to=ljs@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=hongfu.li@linux.dev \
--cc=liam@infradead.org \
--cc=lihongfu@kylinos.cn \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@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.