Re: [PATCH] mm: migrate: requeue destination folio on deferred split queue

From: David Hildenbrand (Arm)

Date: Fri Mar 06 2026 - 08:53:32 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);

Doesn't that mean that you will readd any large folios, even if already
previously taken off the list after scanning?

So I am not sure if your "if the source was a large folio that was on
the queue." comment is accurate?

--
Cheers,

David