Now hugetlb migration is also available for some scenarios, such as soft offling or memory compaction. So we should correct the migration stats for hugetlb with using compound_nr() instead of thp_nr_pages() to get the number of pages. Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx> --- mm/migrate.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index a11e948..2b45a29 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1475,7 +1475,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, * during migration. */ is_thp = PageTransHuge(page) && !PageHuge(page); - nr_subpages = thp_nr_pages(page); + nr_subpages = compound_nr(page); cond_resched(); if (PageHuge(page)) @@ -1540,7 +1540,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, nr_failed += nr_subpages; goto out; } - nr_failed++; + nr_failed += nr_subpages; goto out; case -EAGAIN: if (is_thp) { @@ -1550,14 +1550,14 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, retry++; break; case MIGRATEPAGE_SUCCESS: + nr_succeeded += nr_subpages; if (is_thp) { nr_thp_succeeded++; - nr_succeeded += nr_subpages; break; } - nr_succeeded++; break; default: + nr_failed += nr_subpages; /* * Permanent failure (-EBUSY, etc.): * unlike -EAGAIN case, the failed page is @@ -1566,10 +1566,8 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, */ if (is_thp) { nr_thp_failed++; - nr_failed += nr_subpages; break; } - nr_failed++; break; } } -- 1.8.3.1