mm/migrate: make migrate_pages_batch() stats consistent
authorZi Yan <ziy@nvidia.com>
Tue, 18 Jun 2024 13:41:51 +0000 (09:41 -0400)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 25 Jun 2024 03:52:10 +0000 (20:52 -0700)
As Ying pointed out in [1], stats->nr_thp_failed needs to be updated to
avoid stats inconsistency between MIGRATE_SYNC and MIGRATE_ASYNC when
calling migrate_pages_batch().

Because if not, when migrate_pages_batch() is called via
migrate_pages(MIGRATE_ASYNC), nr_thp_failed will not be increased and when
migrate_pages_batch() is called via migrate_pages(MIGRATE_SYNC*),
nr_thp_failed will be increase in migrate_pages_sync() by
stats->nr_thp_failed += astats.nr_thp_split.

[1] https://lore.kernel.org/linux-mm/87msnq7key.fsf@yhuang6-desk2.ccr.corp.intel.com/

Link: https://lkml.kernel.org/r/20240620012712.19804-1-zi.yan@sent.com
Link: https://lkml.kernel.org/r/20240618134151.29214-1-zi.yan@sent.com
Fixes: 7262f208ca68 ("mm/migrate: split source folio if it is on deferred split list")
Signed-off-by: Zi Yan <ziy@nvidia.com>
Suggested-by: "Huang, Ying" <ying.huang@intel.com>
Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Yin Fengwei <fengwei.yin@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/migrate.c

index 2cc5a68..20cb9f5 100644 (file)
@@ -1659,6 +1659,10 @@ static int migrate_pages_batch(struct list_head *from,
                         * migrate_pages() may report success with (split but
                         * unmigrated) pages still on its fromlist; whereas it
                         * always reports success when its fromlist is empty.
+                        * stats->nr_thp_failed should be increased too,
+                        * otherwise stats inconsistency will happen when
+                        * migrate_pages_batch is called via migrate_pages()
+                        * with MIGRATE_SYNC and MIGRATE_ASYNC.
                         *
                         * Only check it without removing it from the list.
                         * Since the folio can be on deferred_split_scan()
@@ -1675,6 +1679,7 @@ static int migrate_pages_batch(struct list_head *from,
                           !list_empty(&folio->_deferred_list)) {
                                if (try_split_folio(folio, split_folios) == 0) {
                                        nr_failed++;
+                                       stats->nr_thp_failed += is_thp;
                                        stats->nr_thp_split += is_thp;
                                        stats->nr_split++;
                                        continue;