On Mon, Jun 09, 2025 at 05:08:07PM +0000, Shivank Garg wrote:
> Replace open-coded folio reference count calculations with the
> folio_expected_ref_count() helper to improve code maintainability
> and reduce duplication.

I wonder if there is any opportunity for reducing duplication more broadly?
The migration code has similar helpers (folio_expected_refs) as does
khugepaged (is_refcount_suitable) and vmscan (is_page_cache_freeable).
do_huge_pmd_wp_page() also has an open-coded version of these checks and there
are probably others around the place to.

These could all be converted to a helper that returns all the "extra" references
after taking into account things like mapping, swapcache, etc. depending on 
folio.

> No functional changes intended.
> 
> Signed-off-by: Shivank Garg <shiva...@amd.com>
> ---
>  kernel/events/uprobes.c | 5 +++--
>  mm/memfd.c              | 4 ++--
>  2 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
> index 4c965ba77f9f..c978c8c27340 100644
> --- a/kernel/events/uprobes.c
> +++ b/kernel/events/uprobes.c
> @@ -434,10 +434,11 @@ static int __uprobe_write_opcode(struct vm_area_struct 
> *vma,
>       /*
>        * When unregistering, we may only zap a PTE if uffd is disabled and
>        * there are no unexpected folio references ...
> +      * Expected refs: mappings + swapcache.
> +      * We hold one additional reference (+1).
>        */
>       if (is_register || userfaultfd_missing(vma) ||
> -         (folio_ref_count(folio) != folio_mapcount(folio) + 1 +
> -          folio_test_swapcache(folio) * folio_nr_pages(folio)))
> +         (folio_ref_count(folio) != folio_expected_ref_count(folio) + 1))
>               goto remap;
>  
>       /*
> diff --git a/mm/memfd.c b/mm/memfd.c
> index ab367e61553d..4ed5506221b7 100644
> --- a/mm/memfd.c
> +++ b/mm/memfd.c
> @@ -32,8 +32,8 @@
>  
>  static bool memfd_folio_has_extra_refs(struct folio *folio)
>  {
> -     return folio_ref_count(folio) - folio_mapcount(folio) !=
> -            folio_nr_pages(folio);
> +     /* Expected refs: pagecache + mappings */
> +     return folio_ref_count(folio) != folio_expected_ref_count(folio);
>  }
>  
>  static void memfd_tag_pins(struct xa_state *xas)
> -- 
> 2.43.0
> 
> 

Reply via email to