Unverified Commit dea9a794 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!6424 mm/migrate: correct nr_failed in migrate_pages_sync()

Merge Pull Request from: @ci-robot 
 
PR sync from: Liu Shixin <liushixin2@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/FKXPJYFSRJP3XW5LAV3KHUYFPQPBSKK6/ 
Correct nr_failed in migrate_pages_sync().

Zi Yan (2):
  mm/migrate: correct nr_failed in migrate_pages_sync()
  mm/migrate: add nr_split to trace_mm_migrate_pages stats.


-- 
2.25.1
 
https://gitee.com/openeuler/kernel/issues/I9IP8P 
 
Link:https://gitee.com/openeuler/kernel/pulls/6424

 

Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: default avatarXu Kuohai <xukuohai@huawei.com>
Signed-off-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
parents 49f5e285 57dc916b
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -49,10 +49,11 @@ TRACE_EVENT(mm_migrate_pages,

	TP_PROTO(unsigned long succeeded, unsigned long failed,
		 unsigned long thp_succeeded, unsigned long thp_failed,
		 unsigned long thp_split, enum migrate_mode mode, int reason),
		 unsigned long thp_split, unsigned long large_folio_split,
		 enum migrate_mode mode, int reason),

	TP_ARGS(succeeded, failed, thp_succeeded, thp_failed,
		thp_split, mode, reason),
		thp_split, large_folio_split, mode, reason),

	TP_STRUCT__entry(
		__field(	unsigned long,		succeeded)
@@ -60,6 +61,7 @@ TRACE_EVENT(mm_migrate_pages,
		__field(	unsigned long,		thp_succeeded)
		__field(	unsigned long,		thp_failed)
		__field(	unsigned long,		thp_split)
		__field(	unsigned long,		large_folio_split)
		__field(	enum migrate_mode,	mode)
		__field(	int,			reason)
	),
@@ -70,16 +72,18 @@ TRACE_EVENT(mm_migrate_pages,
		__entry->thp_succeeded		= thp_succeeded;
		__entry->thp_failed			= thp_failed;
		__entry->thp_split			= thp_split;
		__entry->large_folio_split	= large_folio_split;
		__entry->mode				= mode;
		__entry->reason				= reason;
	),

	TP_printk("nr_succeeded=%lu nr_failed=%lu nr_thp_succeeded=%lu nr_thp_failed=%lu nr_thp_split=%lu mode=%s reason=%s",
	TP_printk("nr_succeeded=%lu nr_failed=%lu nr_thp_succeeded=%lu nr_thp_failed=%lu nr_thp_split=%lu nr_split=%lu mode=%s reason=%s",
		__entry->succeeded,
		__entry->failed,
		__entry->thp_succeeded,
		__entry->thp_failed,
		__entry->thp_split,
		__entry->large_folio_split,
		__print_symbolic(__entry->mode, MIGRATE_MODE),
		__print_symbolic(__entry->reason, MIGRATE_REASON))
);
+15 −4
Original line number Diff line number Diff line
@@ -1511,6 +1511,7 @@ struct migrate_pages_stats {
	int nr_thp_succeeded;	/* THP migrated successfully */
	int nr_thp_failed;	/* THP failed to be migrated */
	int nr_thp_split;	/* THP split before migrating */
	int nr_split;	/* Large folio (include THP) split before migrating */
};

/*
@@ -1630,6 +1631,7 @@ static int migrate_pages_batch(struct list_head *from,
	int nr_retry_pages = 0;
	int pass = 0;
	bool is_thp = false;
	bool is_large = false;
	struct folio *folio, *folio2, *dst = NULL, *dst2;
	int rc, rc_saved = 0, nr_pages;
	LIST_HEAD(unmap_folios);
@@ -1645,7 +1647,8 @@ static int migrate_pages_batch(struct list_head *from,
		nr_retry_pages = 0;

		list_for_each_entry_safe(folio, folio2, from, lru) {
			is_thp = folio_test_large(folio) && folio_test_pmd_mappable(folio);
			is_large = folio_test_large(folio);
			is_thp = is_large && folio_test_pmd_mappable(folio);
			nr_pages = folio_nr_pages(folio);

			cond_resched();
@@ -1665,6 +1668,7 @@ static int migrate_pages_batch(struct list_head *from,
				stats->nr_thp_failed++;
				if (!try_split_folio(folio, split_folios)) {
					stats->nr_thp_split++;
					stats->nr_split++;
					continue;
				}
				stats->nr_failed_pages += nr_pages;
@@ -1693,11 +1697,12 @@ static int migrate_pages_batch(struct list_head *from,
				nr_failed++;
				stats->nr_thp_failed += is_thp;
				/* Large folio NUMA faulting doesn't split to retry. */
				if (folio_test_large(folio) && !nosplit) {
				if (is_large && !nosplit) {
					int ret = try_split_folio(folio, split_folios);

					if (!ret) {
						stats->nr_thp_split += is_thp;
						stats->nr_split++;
						break;
					} else if (reason == MR_LONGTERM_PIN &&
						   ret == -EAGAIN) {
@@ -1843,6 +1848,7 @@ static int migrate_pages_sync(struct list_head *from, new_folio_t get_new_folio,
	stats->nr_succeeded += astats.nr_succeeded;
	stats->nr_thp_succeeded += astats.nr_thp_succeeded;
	stats->nr_thp_split += astats.nr_thp_split;
	stats->nr_split += astats.nr_split;
	if (rc < 0) {
		stats->nr_failed_pages += astats.nr_failed_pages;
		stats->nr_thp_failed += astats.nr_thp_failed;
@@ -1850,7 +1856,11 @@ static int migrate_pages_sync(struct list_head *from, new_folio_t get_new_folio,
		return rc;
	}
	stats->nr_thp_failed += astats.nr_thp_split;
	nr_failed += astats.nr_thp_split;
	/*
	 * Do not count rc, as pages will be retried below.
	 * Count nr_split only, since it includes nr_thp_split.
	 */
	nr_failed += astats.nr_split;
	/*
	 * Fall back to migrate all failed folios one by one synchronously. All
	 * failed folios except split THPs will be retried, so their failure
@@ -1985,7 +1995,8 @@ int migrate_pages(struct list_head *from, new_folio_t get_new_folio,
	count_vm_events(THP_MIGRATION_SPLIT, stats.nr_thp_split);
	trace_mm_migrate_pages(stats.nr_succeeded, stats.nr_failed_pages,
			       stats.nr_thp_succeeded, stats.nr_thp_failed,
			       stats.nr_thp_split, mode, reason);
			       stats.nr_thp_split, stats.nr_split, mode,
			       reason);

	if (ret_succeeded)
		*ret_succeeded = stats.nr_succeeded;