Re: [PATCH] mm: migrate: requeue destination folio on deferred split queue
From: David Hildenbrand (Arm)
Date: Fri Mar 06 2026 - 08:54:55 EST
On 3/6/26 14:35, Usama Arif wrote:
> During folio migration, __folio_migrate_mapping() removes the source
> folio from the deferred split queue, but the destination folio is never
> re-queued. This causes underutilized THPs to escape the shrinker after
> NUMA migration, since they silently drop off the deferred split list.
>
> Fix this by calling deferred_split_folio() on the destination folio
> after a successful migration, for large rmappable folios.
>
> Reported-by: Johannes Weiner <hannes@xxxxxxxxxxx>
> Fixes: dafff3f4c850 ("mm: split underused THPs")
> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
> ---
> mm/migrate.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/mm/migrate.c b/mm/migrate.c
> index ece77ccb2ec0..98d0a594f7b7 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1393,6 +1393,17 @@ static int migrate_folio_move(free_folio_t put_new_folio, unsigned long private,
> if (old_page_state & PAGE_WAS_MAPPED)
> remove_migration_ptes(src, dst, 0);
>
> + /*
> + * Requeue the destination folio on the deferred split queue if
> + * the source was a large folio that was on the queue. Without
> + * this, NUMA migration causes underutilized THPs to escape
> + * the shrinker since the source is unqueued in
> + * __folio_migrate_mapping() and the destination is never
> + * re-queued.
> + */
> + if (folio_test_large(dst) && folio_test_large_rmappable(dst))
> + deferred_split_folio(dst, false);
Also, should you be checking for anon and non-device folios?
--
Cheers,
David