From: Kaitao Cheng <kaitao.cheng@linux.dev>
To: akpm@linux-foundation.org, vbabka@kernel.org, surenb@google.com,
mhocko@suse.com, jackmanb@google.com, hannes@cmpxchg.org,
ziy@nvidia.com
Cc: liushixin2@huawei.com, david@kernel.org, osalvador@suse.de,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Kaitao Cheng <chengkaitao@kylinos.cn>
Subject: [PATCH] mm: page_isolation: Avoid hugepage scan step underflow
Date: Tue, 19 May 2026 20:16:46 +0800 [thread overview]
Message-ID: <20260519121646.40833-1-kaitao.cheng@linux.dev> (raw)
From: Kaitao Cheng <chengkaitao@kylinos.cn>
page_is_unmovable() checks HugeTLB pages without holding hugetlb_lock and
without pinning the folio. This is intentional for the pageblock scanning
paths, but it means the HugeTLB folio can be freed concurrently after
PageHuge() or folio_test_hugetlb() succeeds.
The existing code avoids folio_hstate() and uses size_to_hstate() because
the HugeTLB flag may already have been cleared. However, if
size_to_hstate() returns NULL, the code still falls through and computes
the scan step from folio_nr_pages(). If the folio has been freed and the
head/large state has been cleared, folio_nr_pages() can return 1. When the
current page is a tail page, subtracting folio_page_idx() from 1 can
underflow and make the scanner skip too far.
Treat a NULL hstate as unmovable so the scanner does not try to skip over
an unstable HugeTLB folio. Once a valid hstate is found, derive the number
of pages from the hstate instead of reading the folio size again. Also
validate the page index before computing the step to avoid underflow if the
page/folio relationship changed concurrently.
Fixes: a0a9f2180b90 ("mm: page_isolation: avoid calling folio_hstate() without hugetlb_lock")
Signed-off-by: Kaitao Cheng <chengkaitao@kylinos.cn>
---
mm/page_isolation.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index c48ff5c00244..99f0b06efaf6 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -43,6 +43,7 @@ bool page_is_unmovable(struct zone *zone, struct page *page,
*/
if (PageHuge(page) || PageCompound(page)) {
struct folio *folio = page_folio(page);
+ unsigned long idx, nr_pages;
if (folio_test_hugetlb(folio)) {
struct hstate *h;
@@ -55,14 +56,21 @@ bool page_is_unmovable(struct zone *zone, struct page *page,
* use folio_hstate() directly.
*/
h = size_to_hstate(folio_size(folio));
- if (h && !hugepage_migration_supported(h))
+ if (!h || !hugepage_migration_supported(h))
return true;
+ nr_pages = pages_per_huge_page(h);
} else if (!folio_test_lru(folio)) {
return true;
+ } else {
+ nr_pages = folio_nr_pages(folio);
}
- *step = folio_nr_pages(folio) - folio_page_idx(folio, page);
+ idx = folio_page_idx(folio, page);
+ if (idx >= nr_pages)
+ return true;
+
+ *step = nr_pages - idx;
return false;
}
--
2.50.1 (Apple Git-155)
next reply other threads:[~2026-05-19 12:17 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-19 12:16 Kaitao Cheng [this message]
2026-05-19 17:54 ` [PATCH] mm: page_isolation: Avoid hugepage scan step underflow Andrew Morton
2026-05-22 9:35 ` Kaitao Cheng
2026-06-01 16:21 ` David Hildenbrand (Arm)
2026-06-02 7:08 ` Kaitao Cheng
2026-06-02 9:30 ` David Hildenbrand (Arm)
2026-05-20 8:51 ` David Hildenbrand (Arm)
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=20260519121646.40833-1-kaitao.cheng@linux.dev \
--to=kaitao.cheng@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=chengkaitao@kylinos.cn \
--cc=david@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=jackmanb@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=liushixin2@huawei.com \
--cc=mhocko@suse.com \
--cc=osalvador@suse.de \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
--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.