From: Pedro Falcato <pfalcato@suse.de>
To: Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>
Cc: Pedro Falcato <pfalcato@suse.de>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <liam@infradead.org>,
Nico Pache <npache@redhat.com>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Usama Arif <usama.arif@linux.dev>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: [PATCH 6/8] mm/khugepaged: hoist isolation into collapse_isolate_folio()
Date: Mon, 20 Jul 2026 15:29:11 +0100 [thread overview]
Message-ID: <20260720142913.846902-7-pfalcato@suse.de> (raw)
In-Reply-To: <20260720142913.846902-1-pfalcato@suse.de>
Signed-off-by: Pedro Falcato <pfalcato@suse.de>
---
mm/khugepaged.c | 118 +++++++++++++++++++++++++++---------------------
1 file changed, 66 insertions(+), 52 deletions(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index db1f765b6ead..429e2c5833d0 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -2332,6 +2332,69 @@ static enum scan_result prepare_collapse_file_folio(pgoff_t index, struct collap
return ret;
}
+static enum scan_result collapse_isolate_folio(struct collapse_file_state *state)
+{
+ struct folio *folio = state->folio;
+ enum scan_result result;
+
+ /*
+ * The folio must be locked, so we can drop the i_pages lock
+ * without racing with truncate.
+ */
+ VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
+
+ /* make sure the folio is up to date */
+ if (unlikely(!folio_test_uptodate(folio))) {
+ result = SCAN_FAIL;
+ goto out_unlock;
+ }
+
+ /*
+ * If file was truncated then extended, or hole-punched, before
+ * we locked the first folio, then a THP might be there already.
+ * This will be discovered on the first iteration.
+ */
+ if (is_pmd_order(folio_order(folio))) {
+ result = SCAN_PTE_MAPPED_HUGEPAGE;
+ goto out_unlock;
+ }
+
+ if (folio_mapping(folio) != state->mapping) {
+ result = SCAN_TRUNCATED;
+ goto out_unlock;
+ }
+
+ if (!state->is_shmem && (folio_test_dirty(folio) ||
+ folio_test_writeback(folio))) {
+ /*
+ * khugepaged only works on clean file-backed folios,
+ * so this folio is dirty because it hasn't been flushed
+ * since first write.
+ */
+ result = SCAN_PAGE_DIRTY_OR_WRITEBACK;
+ goto out_unlock;
+ }
+
+ if (!folio_isolate_lru(folio)) {
+ result = SCAN_DEL_PAGE_LRU;
+ goto out_unlock;
+ }
+
+ if (!filemap_release_folio(folio, GFP_KERNEL)) {
+ result = SCAN_PAGE_HAS_PRIVATE;
+ folio_putback_lru(folio);
+ goto out_unlock;
+ }
+
+ if (folio_mapped(folio))
+ try_to_unmap(folio, TTU_IGNORE_MLOCK | TTU_BATCH_FLUSH);
+ return SCAN_SUCCEED;
+out_unlock:
+ folio_unlock(folio);
+ folio_put(folio);
+ return result;
+}
+
/**
* collapse_file - collapse filemap/tmpfs/shmem pages into huge one.
*
@@ -2442,61 +2505,12 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr,
folio = state.folio;
if (result != SCAN_SUCCEED)
goto xa_unlocked;
- /*
- * The folio must be locked, so we can drop the i_pages lock
- * without racing with truncate.
- */
- VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
-
- /* make sure the folio is up to date */
- if (unlikely(!folio_test_uptodate(folio))) {
- result = SCAN_FAIL;
- goto out_unlock;
- }
-
- /*
- * If file was truncated then extended, or hole-punched, before
- * we locked the first folio, then a THP might be there already.
- * This will be discovered on the first iteration.
- */
- if (is_pmd_order(folio_order(folio))) {
- result = SCAN_PTE_MAPPED_HUGEPAGE;
- goto out_unlock;
- }
-
- if (folio_mapping(folio) != mapping) {
- result = SCAN_TRUNCATED;
- goto out_unlock;
- }
-
- if (!is_shmem && (folio_test_dirty(folio) ||
- folio_test_writeback(folio))) {
- /*
- * khugepaged only works on clean file-backed folios,
- * so this folio is dirty because it hasn't been flushed
- * since first write.
- */
- result = SCAN_PAGE_DIRTY_OR_WRITEBACK;
- goto out_unlock;
- }
- if (!folio_isolate_lru(folio)) {
- result = SCAN_DEL_PAGE_LRU;
- goto out_unlock;
- }
-
- if (!filemap_release_folio(folio, GFP_KERNEL)) {
- result = SCAN_PAGE_HAS_PRIVATE;
- folio_putback_lru(folio);
- goto out_unlock;
- }
-
- if (folio_mapped(folio))
- try_to_unmap(folio,
- TTU_IGNORE_MLOCK | TTU_BATCH_FLUSH);
+ result = collapse_isolate_folio(&state);
+ if (result != SCAN_SUCCEED)
+ goto xa_unlocked;
xas_lock_irq(&xas);
-
VM_BUG_ON_FOLIO(folio != xa_load(xas.xa, index), folio);
/*
--
2.55.0
next prev parent reply other threads:[~2026-07-20 14:29 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-20 14:29 [PATCH 0/8] mm/khugepaged: collapse_file() cleanups Pedro Falcato
2026-07-20 14:29 ` [PATCH 1/8] mm/khugepaged: separate out windy folio logic from collapse_file Pedro Falcato
2026-07-20 15:38 ` Lorenzo Stoakes (ARM)
2026-07-20 15:39 ` Lorenzo Stoakes (ARM)
2026-07-20 14:29 ` [PATCH 2/8] mm/khugepaged: factor out page cache folio reading Pedro Falcato
2026-07-20 16:53 ` Lorenzo Stoakes (ARM)
2026-07-20 14:29 ` [PATCH 3/8] mm/khugepaged: factor out and simplify dirty/writeback handling Pedro Falcato
2026-07-20 14:29 ` [PATCH 4/8] mm/khugepaged: simplify prepare folio locking and exit paths Pedro Falcato
2026-07-20 14:29 ` [PATCH 5/8] mm/khugepaged: add kerneldoc to prepare_collapse_file_folio() Pedro Falcato
2026-07-20 14:29 ` Pedro Falcato [this message]
2026-07-20 14:29 ` [PATCH 7/8] mm/khugepaged: hoist more code into collapse_isolate_folio() Pedro Falcato
2026-07-20 14:29 ` [PATCH 8/8] mm/khugepaged: fix and flesh out try_to_unmap_flush() comment Pedro Falcato
2026-07-20 15:21 ` [PATCH 0/8] mm/khugepaged: collapse_file() cleanups Nico Pache
2026-07-20 19:49 ` Pedro Falcato
2026-07-20 20:14 ` Nico Pache
2026-07-21 7:54 ` Lorenzo Stoakes (ARM)
2026-07-21 8:24 ` Nico Pache
2026-07-21 9:38 ` [syzbot ci] " syzbot ci
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=20260720142913.846902-7-pfalcato@suse.de \
--to=pfalcato@suse.de \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.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=npache@redhat.com \
--cc=ryan.roberts@arm.com \
--cc=usama.arif@linux.dev \
--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.