Re: [PATCH v7] page_alloc: allow migration of smaller hugepages during contig_alloc
From: David Hildenbrand (Red Hat)
Date: Tue Jan 06 2026 - 14:20:56 EST
On 1/6/26 19:56, Zi Yan wrote:
On 6 Jan 2026, at 13:46, David Hildenbrand (Red Hat) wrote:
- return false;
+ /*
+ * Only consider ranges containing hugepages if those pages are
+ * smaller than the requested contiguous region. e.g.:
+ * Move 2MB pages to free up a 1GB range.
+ * Don't move 1GB pages to free up a 2MB range.
+ *
+ * This makes contiguous allocation more reliable if multiple
+ * hugepage sizes are used without causing needless movement.
+ */
+ if (PageHuge(page)) {
+ unsigned int order;
+
+ if (!IS_ENABLED(CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION))
+ return false;
+
+ if (skip_hugetlb) {
+ *skipped_hugetlb = true;
+ return false;
+ }
+
+ page = compound_head(page);
+ order = compound_order(page);
+ if ((order >= MAX_FOLIO_ORDER) ||
+ (nr_pages <= (1 << order)))
+ return false;
+
+ /*
+ * Reaching this point means we've encounted a huge page
+ * smaller than nr_pages, skip all pfn's for that page.
+ *
+ * We can't get here from a tail-PageHuge, as it implies
+ * we started a scan in the middle of a hugepage larger
+ * than nr_pages - which the prior check filters for.
+ */
+ i += (1 << order) - 1;
Assuming page != compound_head(page), you'd be skipping too much.
It might not happen based on my reasoning[1], but feel free to punch poles. :)
:) hehe, I should just have read that comment more carefully.
Anyhow, I wonder whether removing 6 lines of comments by just doing it properly might be better?
head = compound_head(page);
order = compound_order(head);
...
i += (1 << order) - 1 - (page - head);
In any case
Acked-by: David Hildenbrand (Red Hat) <david@xxxxxxxxxx>
--
Cheers
David