[PATCH RFC 09/19] mm: move migratetype definitions to freetype.h
From: Brendan Jackman
Date: Wed Feb 25 2026 - 11:41:44 EST
Since migratetype are a sub-element of freetype, move the pure
definitions into the new freetype.h.
This will enable referring to these raw types from pageblock-flags.h.
Signed-off-by: Brendan Jackman <jackmanb@xxxxxxxxxx>
---
include/linux/freetype.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/mmzone.h | 73 -----------------------------------------
2 files changed, 84 insertions(+), 73 deletions(-)
diff --git a/include/linux/freetype.h b/include/linux/freetype.h
index 9f857d10bb5db..11bd6d2b94349 100644
--- a/include/linux/freetype.h
+++ b/include/linux/freetype.h
@@ -3,6 +3,66 @@
#define _LINUX_FREETYPE_H
#include <linux/types.h>
+#include <linux/mmdebug.h>
+
+/*
+ * A migratetype is the part of a freetype that encodes the mobility
+ * requirements for the allocations the freelist is intended to serve.
+ *
+ * It's also currently overloaded to encode page isolation state.
+ */
+enum migratetype {
+ MIGRATE_UNMOVABLE,
+ MIGRATE_MOVABLE,
+ MIGRATE_RECLAIMABLE,
+ MIGRATE_PCPTYPES, /* the number of types on the pcp lists */
+ MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
+#ifdef CONFIG_CMA
+ /*
+ * MIGRATE_CMA migration type is designed to mimic the way
+ * ZONE_MOVABLE works. Only movable pages can be allocated
+ * from MIGRATE_CMA pageblocks and page allocator never
+ * implicitly change migration type of MIGRATE_CMA pageblock.
+ *
+ * The way to use it is to change migratetype of a range of
+ * pageblocks to MIGRATE_CMA which can be done by
+ * __free_pageblock_cma() function.
+ */
+ MIGRATE_CMA,
+ __MIGRATE_TYPE_END = MIGRATE_CMA,
+#else
+ __MIGRATE_TYPE_END = MIGRATE_HIGHATOMIC,
+#endif
+#ifdef CONFIG_MEMORY_ISOLATION
+ MIGRATE_ISOLATE, /* can't allocate from here */
+#endif
+ MIGRATE_TYPES
+};
+
+/* In mm/page_alloc.c; keep in sync also with show_migration_types() there */
+extern const char * const migratetype_names[MIGRATE_TYPES];
+
+#ifdef CONFIG_CMA
+# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
+#else
+# define is_migrate_cma(migratetype) false
+#endif
+
+static inline bool is_migrate_movable(int mt)
+{
+ return is_migrate_cma(mt) || mt == MIGRATE_MOVABLE;
+}
+
+/*
+ * Check whether a migratetype can be merged with another migratetype.
+ *
+ * It is only mergeable when it can fall back to other migratetypes for
+ * allocation. See fallbacks[MIGRATE_TYPES][3] in page_alloc.c.
+ */
+static inline bool migratetype_is_mergeable(int mt)
+{
+ return mt < MIGRATE_PCPTYPES;
+}
/*
* A freetype is the index used to identify free lists. This consists of a
@@ -35,4 +95,28 @@ static inline bool freetypes_equal(freetype_t a, freetype_t b)
return a.migratetype == b.migratetype;
}
+static inline freetype_t migrate_to_freetype(enum migratetype mt,
+ unsigned int flags)
+{
+ freetype_t freetype;
+
+ /* No flags supported yet. */
+ VM_WARN_ON_ONCE(flags);
+
+ freetype.migratetype = mt;
+ return freetype;
+}
+
+static inline enum migratetype free_to_migratetype(freetype_t freetype)
+{
+ return freetype.migratetype;
+}
+
+/* Convenience helper, return the freetype modified to have the migratetype. */
+static inline freetype_t freetype_with_migrate(freetype_t freetype,
+ enum migratetype migratetype)
+{
+ return migrate_to_freetype(migratetype, freetype_flags(freetype));
+}
+
#endif /* _LINUX_FREETYPE_H */
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 66a4cfc2afcb0..301328cbb8449 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -62,39 +62,7 @@
*/
#define PAGE_ALLOC_COSTLY_ORDER 3
-enum migratetype {
- MIGRATE_UNMOVABLE,
- MIGRATE_MOVABLE,
- MIGRATE_RECLAIMABLE,
- MIGRATE_PCPTYPES, /* the number of types on the pcp lists */
- MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
#ifdef CONFIG_CMA
- /*
- * MIGRATE_CMA migration type is designed to mimic the way
- * ZONE_MOVABLE works. Only movable pages can be allocated
- * from MIGRATE_CMA pageblocks and page allocator never
- * implicitly change migration type of MIGRATE_CMA pageblock.
- *
- * The way to use it is to change migratetype of a range of
- * pageblocks to MIGRATE_CMA which can be done by
- * __free_pageblock_cma() function.
- */
- MIGRATE_CMA,
- __MIGRATE_TYPE_END = MIGRATE_CMA,
-#else
- __MIGRATE_TYPE_END = MIGRATE_HIGHATOMIC,
-#endif
-#ifdef CONFIG_MEMORY_ISOLATION
- MIGRATE_ISOLATE, /* can't allocate from here */
-#endif
- MIGRATE_TYPES
-};
-
-/* In mm/page_alloc.c; keep in sync also with show_migration_types() there */
-extern const char * const migratetype_names[MIGRATE_TYPES];
-
-#ifdef CONFIG_CMA
-# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
# define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA)
/*
* __dump_folio() in mm/debug.c passes a folio pointer to on-stack struct folio,
@@ -103,27 +71,10 @@ extern const char * const migratetype_names[MIGRATE_TYPES];
# define is_migrate_cma_folio(folio, pfn) \
(get_pfnblock_migratetype(&folio->page, pfn) == MIGRATE_CMA)
#else
-# define is_migrate_cma(migratetype) false
# define is_migrate_cma_page(_page) false
# define is_migrate_cma_folio(folio, pfn) false
#endif
-static inline bool is_migrate_movable(int mt)
-{
- return is_migrate_cma(mt) || mt == MIGRATE_MOVABLE;
-}
-
-/*
- * Check whether a migratetype can be merged with another migratetype.
- *
- * It is only mergeable when it can fall back to other migratetypes for
- * allocation. See fallbacks[MIGRATE_TYPES][3] in page_alloc.c.
- */
-static inline bool migratetype_is_mergeable(int mt)
-{
- return mt < MIGRATE_PCPTYPES;
-}
-
#define for_each_free_list(list, zone, order) \
for (order = 0; order < NR_PAGE_ORDERS; order++) \
for (unsigned int idx = 0; \
@@ -131,30 +82,6 @@ static inline bool migratetype_is_mergeable(int mt)
idx < NR_FREETYPE_IDXS; \
idx++)
-static inline freetype_t migrate_to_freetype(enum migratetype mt,
- unsigned int flags)
-{
- freetype_t freetype;
-
- /* No flags supported yet. */
- VM_WARN_ON_ONCE(flags);
-
- freetype.migratetype = mt;
- return freetype;
-}
-
-static inline enum migratetype free_to_migratetype(freetype_t freetype)
-{
- return freetype.migratetype;
-}
-
-/* Convenience helper, return the freetype modified to have the migratetype. */
-static inline freetype_t freetype_with_migrate(freetype_t freetype,
- enum migratetype migratetype)
-{
- return migrate_to_freetype(migratetype, freetype_flags(freetype));
-}
-
extern int page_group_by_mobility_disabled;
freetype_t get_pfnblock_freetype(const struct page *page, unsigned long pfn);
--
2.51.2