[PATCH V3 1/2] mm: export folio_expected_refs for JFS migration handler

Shivank Garg posted 2 patches 8 months ago
There is a newer version of this series
[PATCH V3 1/2] mm: export folio_expected_refs for JFS migration handler
Posted by Shivank Garg 8 months ago
Export folio_expected_refs() to allow filesystem-specific migration
handlers like JFS metapage_migrate_folio to properly verify reference
counts before migration.

Signed-off-by: Shivank Garg <shivankg@amd.com>
---
 include/linux/migrate.h | 1 +
 mm/migrate.c            | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index aaa2114498d6..cb31c5b1eb6a 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -60,6 +60,7 @@ struct movable_operations {
 /* Defined in mm/debug.c: */
 extern const char *migrate_reason_names[MR_TYPES];
 
+int folio_expected_refs(struct address_space *mapping, struct folio *folio);
 #ifdef CONFIG_MIGRATION
 
 void putback_movable_pages(struct list_head *l);
diff --git a/mm/migrate.c b/mm/migrate.c
index 6e2488e5dbe4..0f01b8a87dec 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -445,7 +445,7 @@ void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd)
 }
 #endif
 
-static int folio_expected_refs(struct address_space *mapping,
+int folio_expected_refs(struct address_space *mapping,
 		struct folio *folio)
 {
 	int refs = 1;
@@ -458,6 +458,7 @@ static int folio_expected_refs(struct address_space *mapping,
 
 	return refs;
 }
+EXPORT_SYMBOL_GPL(folio_expected_refs);
 
 /*
  * Replace the folio in the mapping.
-- 
2.34.1
Re: [PATCH V3 1/2] mm: export folio_expected_refs for JFS migration handler
Posted by David Hildenbrand 8 months ago
On 17.04.25 08:06, Shivank Garg wrote:
> Export folio_expected_refs() to allow filesystem-specific migration
> handlers like JFS metapage_migrate_folio to properly verify reference
> counts before migration.
> 
> Signed-off-by: Shivank Garg <shivankg@amd.com>
> ---
>   include/linux/migrate.h | 1 +
>   mm/migrate.c            | 3 ++-
>   2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/migrate.h b/include/linux/migrate.h
> index aaa2114498d6..cb31c5b1eb6a 100644
> --- a/include/linux/migrate.h
> +++ b/include/linux/migrate.h
> @@ -60,6 +60,7 @@ struct movable_operations {
>   /* Defined in mm/debug.c: */
>   extern const char *migrate_reason_names[MR_TYPES];
>   
> +int folio_expected_refs(struct address_space *mapping, struct folio *folio);
>   #ifdef CONFIG_MIGRATION
>   
>   void putback_movable_pages(struct list_head *l);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 6e2488e5dbe4..0f01b8a87dec 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -445,7 +445,7 @@ void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd)
>   }
>   #endif
>   
> -static int folio_expected_refs(struct address_space *mapping,
> +int folio_expected_refs(struct address_space *mapping,
>   		struct folio *folio)
>   {
>   	int refs = 1;
> @@ -458,6 +458,7 @@ static int folio_expected_refs(struct address_space *mapping,
>   
>   	return refs;
>   }
> +EXPORT_SYMBOL_GPL(folio_expected_refs);
>   
>   /*
>    * Replace the folio in the mapping.

Can we make that an inline function instead, and add some documentation?

This function is only suitable if we know the folio is unmapped from 
page tables (no references from page table mappings: !folio_mapped()).

So when exporting this function we either

a) Need a clearer name

b) Should generalize it to consider folio_mapcount() etc, and lookup the
    mapping from the folio.

For your use case, a) might be easier. Maybe call  it something like 
"folio_migration_expected_refs" ?

-- 
Cheers,

David / dhildenb
Re: [PATCH V3 1/2] mm: export folio_expected_refs for JFS migration handler
Posted by Shivank Garg 7 months, 3 weeks ago

On 4/17/2025 2:10 PM, David Hildenbrand wrote:
> On 17.04.25 08:06, Shivank Garg wrote:
>> Export folio_expected_refs() to allow filesystem-specific migration
>> handlers like JFS metapage_migrate_folio to properly verify reference
>> counts before migration.
>>
>> Signed-off-by: Shivank Garg <shivankg@amd.com>
>> ---
>>   include/linux/migrate.h | 1 +
>>   mm/migrate.c            | 3 ++-
>>   2 files changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/migrate.h b/include/linux/migrate.h
>> index aaa2114498d6..cb31c5b1eb6a 100644
>> --- a/include/linux/migrate.h
>> +++ b/include/linux/migrate.h
>> @@ -60,6 +60,7 @@ struct movable_operations {
>>   /* Defined in mm/debug.c: */
>>   extern const char *migrate_reason_names[MR_TYPES];
>>   +int folio_expected_refs(struct address_space *mapping, struct folio *folio);
>>   #ifdef CONFIG_MIGRATION
>>     void putback_movable_pages(struct list_head *l);
>> diff --git a/mm/migrate.c b/mm/migrate.c
>> index 6e2488e5dbe4..0f01b8a87dec 100644
>> --- a/mm/migrate.c
>> +++ b/mm/migrate.c
>> @@ -445,7 +445,7 @@ void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd)
>>   }
>>   #endif
>>   -static int folio_expected_refs(struct address_space *mapping,
>> +int folio_expected_refs(struct address_space *mapping,
>>           struct folio *folio)
>>   {
>>       int refs = 1;
>> @@ -458,6 +458,7 @@ static int folio_expected_refs(struct address_space *mapping,
>>         return refs;
>>   }
>> +EXPORT_SYMBOL_GPL(folio_expected_refs);
>>     /*
>>    * Replace the folio in the mapping.
> 
> Can we make that an inline function instead, and add some documentation?
> 
> This function is only suitable if we know the folio is unmapped from page tables (no references from page table mappings: !folio_mapped()).
> 
> So when exporting this function we either
> 
> a) Need a clearer name
> 
> b) Should generalize it to consider folio_mapcount() etc, and lookup the
>    mapping from the folio.
> 
> For your use case, a) might be easier. Maybe call  it something like "folio_migration_expected_refs" ?
> 

Thank you David for the review. I'll make it a static inline function in the header file
with proper documentation. I don't need to EXPORT it then, since it will be an inline function.

Best Regards,
Shivank