From: Lance Yang <lance.yang@linux.dev>
To: David Hildenbrand <david@redhat.com>
Cc: lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com,
baohua@kernel.org, baolin.wang@linux.alibaba.com,
dev.jain@arm.com, hughd@google.com, ioworker0@gmail.com,
kirill@shutemov.name, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, mpenttil@redhat.com, npache@redhat.com,
ryan.roberts@arm.com, ziy@nvidia.com, richard.weiyang@gmail.com,
akpm@linux-foundation.org
Subject: Re: [PATCH mm-new 1/1] mm/khugepaged: abort collapse scan on non-swap entries
Date: Wed, 24 Sep 2025 19:47:11 +0800 [thread overview]
Message-ID: <69621b58-5142-48ea-9dd8-6baed69e50f8@linux.dev> (raw)
In-Reply-To: <1282de5a-3dce-443d-91d1-111103140973@redhat.com>
On 2025/9/24 18:10, David Hildenbrand wrote:
> On 24.09.25 12:02, Lance Yang wrote:
>> From: Lance Yang <lance.yang@linux.dev>
>>
>> The existing check in hpage_collapse_scan_pmd() is specific to uffd-wp
>> markers. Other special markers (e.g., GUARD, POISONED) would not be
>> caught
>> early, leading to failures deeper in the swap-in logic.
>>
>> hpage_collapse_scan_pmd()
>> `- collapse_huge_page()
>> `- __collapse_huge_page_swapin() -> fails!
>>
>> As David suggested[1], this patch skips any such non-swap entries early.
>> If a special marker is found, the scan is aborted immediately with the
>> SCAN_PTE_NON_PRESENT result, as Lorenzo suggested[2], avoiding wasted
>> work.
>
> Note that I suggested to skip all non-present entries except swap
> entries, which includes migration entries, hwpoisoned entries etc.
Oops, I completely misunderstood your suggestion :(
It should be to handle all special non-present entries (migration,
hwpoison, markers), not just a specific type of marker ...
How about this version, which handles all non-swap entries as you
suggested?
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 7ab2d1a42df3..27f432e7f07c 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1284,7 +1284,23 @@ static int hpage_collapse_scan_pmd(struct
mm_struct *mm,
for (addr = start_addr, _pte = pte; _pte < pte + HPAGE_PMD_NR;
_pte++, addr += PAGE_SIZE) {
pte_t pteval = ptep_get(_pte);
- if (is_swap_pte(pteval)) {
+ if (pte_none(pteval) || is_zero_pfn(pte_pfn(pteval))) {
+ ++none_or_zero;
+ if (!userfaultfd_armed(vma) &&
+ (!cc->is_khugepaged ||
+ none_or_zero <= khugepaged_max_ptes_none)) {
+ continue;
+ } else {
+ result = SCAN_EXCEED_NONE_PTE;
+ count_vm_event(THP_SCAN_EXCEED_NONE_PTE);
+ goto out_unmap;
+ }
+ } else if (!pte_present(pteval)) {
+ if (non_swap_entry(pte_to_swp_entry(pteval))) {
+ result = SCAN_PTE_NON_PRESENT;
+ goto out_unmap;
+ }
+
++unmapped;
if (!cc->is_khugepaged ||
unmapped <= khugepaged_max_ptes_swap) {
@@ -1293,7 +1309,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_any(pteval)) {
+ if (pte_swp_uffd_wp(pteval)) {
result = SCAN_PTE_UFFD_WP;
goto out_unmap;
}
@@ -1304,18 +1320,6 @@ static int hpage_collapse_scan_pmd(struct
mm_struct *mm,
goto out_unmap;
}
}
- if (pte_none(pteval) || is_zero_pfn(pte_pfn(pteval))) {
- ++none_or_zero;
- if (!userfaultfd_armed(vma) &&
- (!cc->is_khugepaged ||
- none_or_zero <= khugepaged_max_ptes_none)) {
- continue;
- } else {
- result = SCAN_EXCEED_NONE_PTE;
- count_vm_event(THP_SCAN_EXCEED_NONE_PTE);
- goto out_unmap;
- }
- }
if (pte_uffd_wp(pteval)) {
/*
* Don't collapse the page if any of the small
---
Thanks,
Lance
next prev parent reply other threads:[~2025-09-24 11:47 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-24 10:02 [PATCH mm-new 1/1] mm/khugepaged: abort collapse scan on non-swap entries Lance Yang
2025-09-24 10:10 ` David Hildenbrand
2025-09-24 10:17 ` Kiryl Shutsemau
2025-09-24 10:40 ` David Hildenbrand
2025-09-24 11:47 ` Lance Yang [this message]
2025-09-29 10:10 ` Lance Yang
2025-09-29 10:29 ` David Hildenbrand
2025-09-29 10:39 ` Lance Yang
2025-09-24 10:10 ` Kiryl Shutsemau
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=69621b58-5142-48ea-9dd8-6baed69e50f8@linux.dev \
--to=lance.yang@linux.dev \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@redhat.com \
--cc=dev.jain@arm.com \
--cc=hughd@google.com \
--cc=ioworker0@gmail.com \
--cc=kirill@shutemov.name \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mpenttil@redhat.com \
--cc=npache@redhat.com \
--cc=richard.weiyang@gmail.com \
--cc=ryan.roberts@arm.com \
--cc=ziy@nvidia.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.