[PATCH] mm/migrate: Add native folio functions

yahia posted 1 patch 3 hours ago
include/linux/page-flags.h | 7 +++++++
mm/migrate.c               | 5 +++++
2 files changed, 12 insertions(+)
[PATCH] mm/migrate: Add native folio functions
Posted by yahia 3 hours ago
Hello,

I aim provides in this patch to provide native
folio abstractions for page functions like movable_ops
by wrapping folio->page structure in the native page function

Signed-off-by: yahia <yahia.a.abdrabou@gmail.com>
---
 include/linux/page-flags.h | 7 +++++++
 mm/migrate.c               | 5 +++++
 2 files changed, 12 insertions(+)

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 7223f6f4e2b4..6776cf821edd 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -1110,6 +1110,7 @@ bool is_free_buddy_page(const struct page *page);
  */
 TESTPAGEFLAG(MovableOps, movable_ops, PF_NO_TAIL);
 SETPAGEFLAG(MovableOps, movable_ops, PF_NO_TAIL);
+FOLIO_TEST_FLAG(MovableOpsIsolated, movable_ops_isolated)
 /*
  * A movable_ops page has this flag set while it is isolated for migration.
  * This flag primarily protects against concurrent migration attempts.
@@ -1139,6 +1140,12 @@ static inline bool page_has_movable_ops(const struct page *page)
 	       (PageOffline(page) || PageZsmalloc(page));
 }
 
+static inline bool folio_has_movable_ops(struct folio *folio)
+{
+	return PageMovableOps(&folio->page) &&
+		(PageOffline(&folio->page) || PageZsmalloc(&folio->page));
+}
+
 static __always_inline int PageAnonExclusive(const struct page *page)
 {
 	VM_BUG_ON_PGFLAGS(!PageAnon(page), page);
diff --git a/mm/migrate.c b/mm/migrate.c
index 8a64291ab5b4..817a8c0b84d9 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -96,6 +96,11 @@ static const struct movable_operations *page_movable_ops(struct page *page)
 	return NULL;
 }
 
+static const struct movable_operations *folio_movable_ops(struct folio *folio)
+{
+	return page_movable_ops(&folio->page);
+}
+
 /**
  * isolate_movable_ops_page - isolate a movable_ops page for migration
  * @page: The page.
-- 
2.54.0
Re: [PATCH] mm/migrate: Add native folio functions
Posted by Zi Yan 2 hours ago
On 7 Jun 2026, at 20:12, yahia wrote:

> Hello,
>
> I aim provides in this patch to provide native
> folio abstractions for page functions like movable_ops
> by wrapping folio->page structure in the native page function

MovableOps and MovableOpsIsolated pages are not folios and they
are supposed to only be order-0 pages. This patch is unnecessary.

Please read the original patchset for more details[1].

[1] https://lore.kernel.org/all/20250704102524.326966-1-david@redhat.com/

>
> Signed-off-by: yahia <yahia.a.abdrabou@gmail.com>
> ---
>  include/linux/page-flags.h | 7 +++++++
>  mm/migrate.c               | 5 +++++
>  2 files changed, 12 insertions(+)
>
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index 7223f6f4e2b4..6776cf821edd 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -1110,6 +1110,7 @@ bool is_free_buddy_page(const struct page *page);
>   */
>  TESTPAGEFLAG(MovableOps, movable_ops, PF_NO_TAIL);
>  SETPAGEFLAG(MovableOps, movable_ops, PF_NO_TAIL);
> +FOLIO_TEST_FLAG(MovableOpsIsolated, movable_ops_isolated)
>  /*
>   * A movable_ops page has this flag set while it is isolated for migration.
>   * This flag primarily protects against concurrent migration attempts.
> @@ -1139,6 +1140,12 @@ static inline bool page_has_movable_ops(const struct page *page)
>  	       (PageOffline(page) || PageZsmalloc(page));
>  }
>
> +static inline bool folio_has_movable_ops(struct folio *folio)
> +{
> +	return PageMovableOps(&folio->page) &&
> +		(PageOffline(&folio->page) || PageZsmalloc(&folio->page));
> +}
> +
>  static __always_inline int PageAnonExclusive(const struct page *page)
>  {
>  	VM_BUG_ON_PGFLAGS(!PageAnon(page), page);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 8a64291ab5b4..817a8c0b84d9 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -96,6 +96,11 @@ static const struct movable_operations *page_movable_ops(struct page *page)
>  	return NULL;
>  }
>
> +static const struct movable_operations *folio_movable_ops(struct folio *folio)
> +{
> +	return page_movable_ops(&folio->page);
> +}
> +
>  /**
>   * isolate_movable_ops_page - isolate a movable_ops page for migration
>   * @page: The page.
> -- 
> 2.54.0


--
Best Regards,
Yan, Zi