On 02.07.25 12:34, Harry Yoo wrote:
On Mon, Jun 30, 2025 at 03:00:00PM +0200, David Hildenbrand wrote:
... instead, look them up statically based on the page type. Maybe in the
future we want a registration interface? At least for now, it can be
easily handled using the two page types that actually support page
migration.
The remaining usage of page->mapping is to flag such pages as actually
being movable (having movable_ops), which we will change next.
Reviewed-by: Zi Yan <z...@nvidia.com>
Signed-off-by: David Hildenbrand <da...@redhat.com>
---
+static const struct movable_operations *page_movable_ops(struct page *page)
+{
+ VM_WARN_ON_ONCE_PAGE(!page_has_movable_ops(page), page);
+
+ /*
+ * If we enable page migration for a page of a certain type by marking
+ * it as movable, the page type must be sticky until the page gets freed
+ * back to the buddy.
+ */
+#ifdef CONFIG_BALLOON_COMPACTION
+ if (PageOffline(page))
+ /* Only balloon compaction sets PageOffline pages movable. */
+ return &balloon_mops;
+#endif /* CONFIG_BALLOON_COMPACTION */
+#if defined(CONFIG_ZSMALLOC) && defined(CONFIG_COMPACTION)
+ if (PageZsmalloc(page))
+ return &zsmalloc_mops;
+#endif /* defined(CONFIG_ZSMALLOC) && defined(CONFIG_COMPACTION) */
What happens if:
CONFIG_ZSMALLOC=y
CONFIG_TRANSPARENT_HUGEPAGE=n
CONFIG_COMPACTION=n
CONFIG_MIGRATION=y
Pages are never allocated from ZONE_MOVABLE/CMA and are not marked as
having movable_ops, so we never end up in this function. See how
zsmalloc.c deals with CONFIG_COMPACTION, especially how
SetZsPageMovable() is a NOP without it.
As a side note, both should probably be moved from COMPACTION to
MIGRATION. Although probably in practice, anybody enabling
CONFIG_MIGRATION likely also enables CONFIG_COMPACTION.
--
Cheers,
David / dhildenb