From: "Zi Yan" <ziy@nvidia.com>
To: "Usama Arif" <usama.arif@linux.dev>,
"Andrew Morton" <akpm@linux-foundation.org>, <david@kernel.org>,
<chrisl@kernel.org>, <kasong@tencent.com>, <ljs@kernel.org>,
<linux-mm@kvack.org>
Cc: <ying.huang@linux.alibaba.com>,
"Baoquan He" <baoquan.he@linux.dev>, <willy@infradead.org>,
<youngjun.park@lge.com>, <hannes@cmpxchg.org>, <riel@surriel.com>,
<shakeel.butt@linux.dev>, <alex@ghiti.fr>, <kas@kernel.org>,
<baohua@kernel.org>, <dev.jain@arm.com>,
<baolin.wang@linux.alibaba.com>,
"Nico Pache" <nico.pache@linux.dev>,
"Liam R.Howlett" <liam@infradead.org>, <ryan.roberts@arm.com>,
"Vlastimil Babka" <vbabka@kernel.org>, <lance.yang@linux.dev>,
<linux-kernel@vger.kernel.org>, <nphamcs@gmail.com>,
<shikemeng@huaweicloud.com>, <yosry@kernel.org>,
<qi.zheng@linux.dev>, <luizcap@redhat.com>,
<kernel-team@meta.com>
Subject: Re: [PATCH v8 13/30] mm: handle PMD swap entries in fork path
Date: Fri, 09 Oct 2026 13:40:17 -0400 [thread overview]
Message-ID: <DM0HPT9WBHEM.1XEFJ6BZ7PPWL@nvidia.com> (raw)
In-Reply-To: <20261002095503.3585565-14-usama.arif@linux.dev>
On Fri Oct 2, 2026 at 5:52 AM EDT, Usama Arif wrote:
> copy_huge_pmd() only knows about migration and device-private PMDs, so a
> PMD swap entry would fall through to the present-PMD path and fork() would
> duplicate it without taking a reference on the slots it points at.
>
> Copy it the way copy_nonpresent_pte() copies a PTE swap entry: duplicate
> the swap references, clear the exclusive marker on the source, put the
> destination mm on mmlist, and account the child's slots to MM_SWAPENTS.
>
> The GFP_ATOMIC extend-table allocation inside the dup can fail. Report that
> as -EIO and let copy_pmd_range() retry with GFP_KERNEL, as
> copy_nonpresent_pte() and copy_pte_range() already do for a PTE swap entry.
> copy_huge_pmd() hands the entry back so the caller knows which range to
> allocate for.
>
> Only -ENOMEM is reported that way. The other failures mean the entry itself
> is bad, and swap_retry_table_alloc_nr() returns 0 for those, so collapsing
> them into -EIO as the PTE path does would spin in the caller's retry rather
> than failing the fork.
>
> While here, move the mm counter update into each entry-type arm, as the PTE
> version does, so the swap arm can account MM_SWAPENTS instead of
> MM_ANONPAGES.
>
> Signed-off-by: Usama Arif <usama.arif@linux.dev>
> ---
> include/linux/huge_mm.h | 3 +-
> mm/huge_memory.c | 62 ++++++++++++++++++++++++++++++-----------
> mm/memory.c | 12 +++++++-
> 3 files changed, 58 insertions(+), 19 deletions(-)
>
> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
> index 8205e83f27771..7aa63d982af07 100644
> --- a/include/linux/huge_mm.h
> +++ b/include/linux/huge_mm.h
> @@ -10,7 +10,8 @@
> vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf);
> int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
> pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,
> - struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma);
> + struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma,
> + softleaf_t *entryp);
> bool huge_pmd_set_accessed(struct vm_fault *vmf);
> int copy_huge_pud(struct mm_struct *dst_mm, struct mm_struct *src_mm,
> pud_t *dst_pud, pud_t *src_pud, unsigned long addr,
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 24d116ae1fc30..80d18ca972ecf 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -1894,7 +1894,7 @@ bool touch_pmd(struct vm_area_struct *vma, unsigned long addr,
> return false;
> }
>
> -static void copy_huge_non_present_pmd(
> +static int copy_huge_non_present_pmd(
> struct mm_struct *dst_mm, struct mm_struct *src_mm,
> pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,
> struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma,
> @@ -1902,18 +1902,41 @@ static void copy_huge_non_present_pmd(
> {
> softleaf_t entry = softleaf_from_pmd(pmd);
> struct folio *src_folio;
> + int err;
>
> VM_WARN_ON_ONCE(!pmd_is_valid_softleaf(pmd));
>
> - if (softleaf_is_migration_write(entry) ||
> - softleaf_is_migration_read_exclusive(entry)) {
> - entry = make_readable_migration_entry(swp_offset(entry));
> - pmd = softleaf_to_pmd(entry);
> - if (pmd_swp_soft_dirty(*src_pmd))
> - pmd = pmd_swp_mksoft_dirty(pmd);
> - if (pmd_swp_uffd(*src_pmd))
> - pmd = pmd_swp_mkuffd(pmd);
> - set_pmd_at(src_mm, addr, src_pmd, pmd);
> + if (softleaf_is_swap(entry)) {
> + /*
> + * A PMD swap entry only exists under CONFIG_THP_SWAP, where
> + * SWAPFILE_CLUSTER == HPAGE_PMD_NR, and it is cluster aligned,
> + * so these HPAGE_PMD_NR slots are exactly one cluster - which
> + * is what swap_dup_entries_direct() requires.
> + */
> + err = swap_dup_entries_direct(entry, HPAGE_PMD_NR);
> + if (err)
> + /* Only -ENOMEM is worth a GFP_KERNEL retry. */
Is it better to say "if swap_dup_entries_direct() cannot allocate
memory, return -EIO so that the caller can retry with GFP_KERNEL. Fail
the fork on any other error"? It clarifies why EIO is needed.
> + return err == -ENOMEM ? -EIO : -ENOMEM;
> +
Otherwise, LGTM.
Reviewed-by: Zi Yan <ziy@nvidia.com>
--
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2026-10-09 17:40 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-02 9:52 [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs Usama Arif
2026-10-02 9:52 ` [PATCH v8 01/30] mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio() Usama Arif
2026-10-02 9:52 ` [PATCH v8 02/30] arm64: mm: add PMD swap-exclusive helpers Usama Arif
2026-10-02 9:52 ` [PATCH v8 03/30] loongarch: " Usama Arif
2026-10-02 14:17 ` Huacai Chen
2026-10-02 9:52 ` [PATCH v8 04/30] powerpc: " Usama Arif
2026-10-05 4:55 ` LEROY Christophe
2026-10-02 9:52 ` [PATCH v8 05/30] riscv: " Usama Arif
2026-10-02 9:52 ` [PATCH v8 06/30] s390: " Usama Arif
2026-10-02 9:52 ` [PATCH v8 07/30] x86: " Usama Arif
2026-10-05 20:14 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 08/30] mm: recognize PMD swap entries in the softleaf layer Usama Arif
2026-10-08 2:06 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 09/30] mm/debug_vm_pgtable: test PMD swap-exclusive helpers Usama Arif
2026-10-08 2:09 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 10/30] mm: make PMD migration-entry splitting explicit Usama Arif
2026-10-08 2:53 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 11/30] mm: split PMD swap entries into PTE swap entries Usama Arif
2026-10-09 2:16 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 12/30] mm/swap: allow duplicating a range of " Usama Arif
2026-10-02 9:52 ` [PATCH v8 13/30] mm: handle PMD swap entries in fork path Usama Arif
2026-10-09 17:40 ` Zi Yan [this message]
2026-10-02 9:52 ` [PATCH v8 14/30] mm: zswap: reject high-order swap cache allocations backed by zswap Usama Arif
2026-10-05 20:18 ` Yosry Ahmed
2026-10-02 9:52 ` [PATCH v8 15/30] mm: swap in PMD swap entries as whole THPs during swapoff Usama Arif
2026-10-09 19:09 ` Zi Yan
2026-10-02 9:52 ` [PATCH v8 16/30] fs/proc: account PMD swap entries in smaps Usama Arif
2026-10-02 9:52 ` [PATCH v8 17/30] mm: handle soft-dirty and uffd-wp on PMD swap entries Usama Arif
2026-10-02 9:52 ` [PATCH v8 18/30] mm/hmm: fault PMD swap entries on demand Usama Arif
2026-10-02 9:52 ` [PATCH v8 19/30] mm: free PMD swap entries in zap_huge_pmd() Usama Arif
2026-10-02 9:52 ` [PATCH v8 20/30] mm/madvise: free PMD swap entries with MADV_FREE Usama Arif
2026-10-02 9:52 ` [PATCH v8 21/30] mm/madvise: skip PMD swap entries for MADV_COLD and MADV_PAGEOUT Usama Arif
2026-10-02 9:52 ` [PATCH v8 22/30] mm/madvise: keep PMD swap entries whole for MADV_GUARD_INSTALL/REMOVE Usama Arif
2026-10-02 9:52 ` [PATCH v8 23/30] mm/mincore: report PMD swap-cache residency Usama Arif
2026-10-02 9:52 ` [PATCH v8 24/30] mm/khugepaged: treat PMD swap entries as mapped THPs Usama Arif
2026-10-02 9:52 ` [PATCH v8 25/30] mm: handle PMD swap entries in MADV_WILLNEED Usama Arif
2026-10-02 9:52 ` [PATCH v8 26/30] mm: handle PMD swap entries in UFFDIO_MOVE Usama Arif
2026-10-04 8:19 ` Lance Yang
2026-10-02 9:52 ` [PATCH v8 27/30] mm: don't PTE-batch a swap-in over a hardware-poisoned subpage Usama Arif
2026-10-02 9:52 ` [PATCH v8 28/30] mm: handle PMD swap entry faults on swap-in Usama Arif
2026-10-04 10:19 ` Lance Yang
2026-10-02 9:52 ` [PATCH v8 29/30] mm: install PMD swap entries on swap-out Usama Arif
2026-10-02 9:52 ` [PATCH v8 30/30] selftests/mm: add PMD swap entry tests Usama Arif
2026-10-08 2:47 ` Luiz Capitulino
2026-10-02 14:28 ` [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs David Hildenbrand (Arm)
2026-10-02 15:13 ` Zi Yan
2026-10-04 12:39 ` Usama Arif
2026-10-04 3:08 ` Lance Yang
2026-10-08 15:21 ` Luiz Capitulino
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=DM0HPT9WBHEM.1XEFJ6BZ7PPWL@nvidia.com \
--to=ziy@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=alex@ghiti.fr \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=chrisl@kernel.org \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=hannes@cmpxchg.org \
--cc=kas@kernel.org \
--cc=kasong@tencent.com \
--cc=kernel-team@meta.com \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=luizcap@redhat.com \
--cc=nico.pache@linux.dev \
--cc=nphamcs@gmail.com \
--cc=qi.zheng@linux.dev \
--cc=riel@surriel.com \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=willy@infradead.org \
--cc=ying.huang@linux.alibaba.com \
--cc=yosry@kernel.org \
--cc=youngjun.park@lge.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.