In unmap_and_move(), if the new THP cannot be allocated, -ENOMEM will be returned, and migrate_pages() will try to split the THP unless "reason" is MR_NUMA_MISPLACED (that is, nosplit == true). But when nosplit == true, the THP migration failure will not be counted. This is incorrect. So in this patch, the THP migration failure will be counted for -ENOMEM regardless of nosplit is true or false. The nr_failed counting is fixed too, although that is not used actually. Signed-off-by: "Huang, Ying" <ying.huang@xxxxxxxxx> Fixes: 5984fabb6e82 ("mm: move_pages: report the number of non-attempted pages") Cc: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx> Cc: Zi Yan <ziy@xxxxxxxxxx> Cc: Yang Shi <shy828301@xxxxxxxxx> --- mm/migrate.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 82444e7df9f1..542533e4e3cf 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1425,11 +1425,11 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, /* * When memory is low, don't bother to try to migrate * other pages, just exit. - * THP NUMA faulting doesn't split THP to retry. */ - if (is_thp && !nosplit) { + if (is_thp) { nr_thp_failed++; - if (!try_split_thp(page, &thp_split_pages)) { + /* THP NUMA faulting doesn't split THP to retry. */ + if (!nosplit && !try_split_thp(page, &thp_split_pages)) { nr_thp_split++; goto retry; } @@ -1446,6 +1446,8 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, */ list_splice_init(&thp_split_pages, from); nr_thp_failed += thp_retry; + if (!no_subpage_counting) + nr_failed += retry; goto out; case -EAGAIN: if (is_thp) -- 2.30.2