Skip to content

Commit ba23f58

Browse files
davidhildenbrandakpm00
authored andcommitted
mm/migrate: don't call folio_putback_active_hugetlb() on dst hugetlb folio
We replaced a simple put_page() by a putback_active_hugepage() call in commit 3aaa76e ("mm: migrate: hugetlb: putback destination hugepage to active list"), to set the "active" flag on the dst hugetlb folio. Nowadays, we decoupled the "active" list from the flag, by calling the flag "migratable". Calling "putback" on something that wasn't allocated is weird and not future proof, especially if we might reach that path when migration failed and we just want to free the freshly allocated hugetlb folio. Let's simply handle the migratable flag and the active list flag in move_hugetlb_state(), where we know that allocation succeeded and already handle the temporary flag; use a simple folio_put() to return our reference. Link: https://lkml.kernel.org/r/20250113131611.2554758-4-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Sidhartha Kumar <sidhartha.kumar@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 4c640f1 commit ba23f58

2 files changed

Lines changed: 14 additions & 4 deletions

File tree

mm/hugetlb.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7533,6 +7533,16 @@ void move_hugetlb_state(struct folio *old_folio, struct folio *new_folio, int re
75337533
}
75347534
spin_unlock_irq(&hugetlb_lock);
75357535
}
7536+
7537+
/*
7538+
* Our old folio is isolated and has "migratable" cleared until it
7539+
* is putback. As migration succeeded, set the new folio "migratable"
7540+
* and add it to the active list.
7541+
*/
7542+
spin_lock_irq(&hugetlb_lock);
7543+
folio_set_hugetlb_migratable(new_folio);
7544+
list_move_tail(&new_folio->lru, &(folio_hstate(new_folio))->hugepage_activelist);
7545+
spin_unlock_irq(&hugetlb_lock);
75367546
}
75377547

75387548
static void hugetlb_unshare_pmds(struct vm_area_struct *vma,

mm/migrate.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,14 +1539,14 @@ static int unmap_and_move_huge_page(new_folio_t get_new_folio,
15391539
list_move_tail(&src->lru, ret);
15401540

15411541
/*
1542-
* If migration was not successful and there's a freeing callback, use
1543-
* it. Otherwise, put_page() will drop the reference grabbed during
1544-
* isolation.
1542+
* If migration was not successful and there's a freeing callback,
1543+
* return the folio to that special allocator. Otherwise, simply drop
1544+
* our additional reference.
15451545
*/
15461546
if (put_new_folio)
15471547
put_new_folio(dst, private);
15481548
else
1549-
folio_putback_active_hugetlb(dst);
1549+
folio_put(dst);
15501550

15511551
return rc;
15521552
}

0 commit comments

Comments
 (0)