From patchwork Fri Mar 3 03:01:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 13158303 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22D08C6FA8E for ; Fri, 3 Mar 2023 03:02:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A60186B0078; Thu, 2 Mar 2023 22:02:32 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A0F456B007B; Thu, 2 Mar 2023 22:02:32 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8D7A96B007D; Thu, 2 Mar 2023 22:02:32 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 7D94C6B0078 for ; Thu, 2 Mar 2023 22:02:32 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 56B04C08A0 for ; Fri, 3 Mar 2023 03:02:32 +0000 (UTC) X-FDA: 80526088944.14.012CCD8 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by imf19.hostedemail.com (Postfix) with ESMTP id 1C2BD1A0016 for ; Fri, 3 Mar 2023 03:02:29 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Eo/vWyi2"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf19.hostedemail.com: domain of ying.huang@intel.com designates 192.55.52.43 as permitted sender) smtp.mailfrom=ying.huang@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677812550; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=n/kFfcbL5BcUD7Wzk0JRXoQqtz7fFm8feDKeIV6onP8=; b=YrhLfgnmA3INfzuNKZstByyKua73ArgDW2IB9mBvIrpq7KjFhITKs8Mc02IafQ8PB1YnVX 2HHmfdD6F6RRT10BdVeEY1T2fDdy1WgON1QXytnJFps3Dvae9g+tCKPWWPTNXlolBmkhaZ /zvY+aSMeFTa527E4wdKvFa7q8nzM8Y= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Eo/vWyi2"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf19.hostedemail.com: domain of ying.huang@intel.com designates 192.55.52.43 as permitted sender) smtp.mailfrom=ying.huang@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677812550; a=rsa-sha256; cv=none; b=njqYWSRMidDVTfz1o0EhvxHIv22E2+Kdc8dloIEWTYhcSM04PpCrFFSvHJhmdrOeq/QW+7 D8qVYRtRS8IXE/mfqHkBP3Fo3gaCVBXJ+iBm5gAxkhq7yqmqJLdPUjU5Ba/wNRUe//mhMv L5F69/mTz2GElunSug6h+Yw7Fiknw5o= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1677812550; x=1709348550; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CQPo+dMFAQNly6q5kcMf4N2WZveYtr21szEchM1lhiI=; b=Eo/vWyi2l8yYtG9ejjNh+28n35hBxwKl8UVB/1XQ/jOwS6k/NdyXWGx6 Ks6IznzgsFImgDqTlRINhnFWRgp4359BNY1clBhLrdTf5TIUcW6ZcPIYi PR0h4SGvwAKGMtd1tddYiGADPfovIjrvK1wXotLO1j+XBKPoWCfcWytNY w225GLw0umie+l8LU1ayC0MwdFI5JFg6C2O30T7/YsAiPPgpOViWcP6R0 QknCYkBb6gZrjK6syV8J+c8wQ8+A7tVBQvZPZjswG/4DDKjlL8VIZvDGy zXTX6mI59hpQRVNCyiD6mh2Hhi7rHFO40P+QW/pXxAxWKpArsS6fb0nyQ w==; X-IronPort-AV: E=McAfee;i="6500,9779,10637"; a="421207123" X-IronPort-AV: E=Sophos;i="5.98,229,1673942400"; d="scan'208";a="421207123" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Mar 2023 19:02:29 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10637"; a="668497693" X-IronPort-AV: E=Sophos;i="5.98,229,1673942400"; d="scan'208";a="668497693" Received: from xinyumao-mobl.ccr.corp.intel.com (HELO yhuang6-mobl2.ccr.corp.intel.com) ([10.255.31.231]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Mar 2023 19:02:25 -0800 From: Huang Ying To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Huang Ying , Baolin Wang , Hugh Dickins , "Xu, Pengfei" , Christoph Hellwig , Stefan Roesch , Tejun Heo , Xin Hao , Zi Yan , Yang Shi , Matthew Wilcox , Mike Kravetz Subject: [PATCH -V2 2/3] migrate_pages: move split folios processing out of migrate_pages_batch() Date: Fri, 3 Mar 2023 11:01:54 +0800 Message-Id: <20230303030155.160983-3-ying.huang@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230303030155.160983-1-ying.huang@intel.com> References: <20230303030155.160983-1-ying.huang@intel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 1C2BD1A0016 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: xzubfnczhd3qq1boa6fcme5qog74rjsa X-HE-Tag: 1677812549-6420 X-HE-Meta: U2FsdGVkX1884H/JdmxuyfOdpPqiY6wYgN0hqkYlznHfBnoFtcchkB1teAyKjWijHfqymAF8qsLMEIMH/pNpn/Sqrdnk105R4AWu38coquUen9Lz871k4wCN6xadTh5/d8zDHoDYAejAMPb1Flp86+QzLsASInoK+n9o6+Or8zV0bclxxLad3hhuJ8Dna9ooiXx/Xxp/TBNa/p7Ie+mgB2zpIdCUI7N7dxB2HKQfdf24UHggRo3JK7b19ZHsoLvpOzPXqVc0lbr/JmWHBvC0GQBb3FHSAPRBB+fxlpmttqj+RlrcgncOJrc2wwOqWFjSxT8mOCN76SDkQYdIWlJgTpdDp7y9UvdQIiX9X9xTzP0fQoU+crY12TH0wP6/+83lf9Y7cK+wDB84jpXA3vBsPVI4EqoxAAEslCSkjVZJWELn16DQ7maZdZ7Lf3SCCx/icYeXpFw5pSldsQ5JOBt0fpVP3jE9ZW/A11nzVIhRcUhIxWylqw9tFxVlly00SUP1/tGumDxHfZhkoCdvEK5QxGnfpAjoJ2tpZ5VOyk/4jAPPXoMpf9iLOP7JiAew2oJWLUDpu/D8EMCXlm5Sy8rwKJ1xiaNn8Fs8dBtZ0S+bBj6cEgcQEEh6JoUzED16YzFCXpVq0AWtoh75tWIGK5+W5Pb4O6Q5yojTlp/94h6/Br7Qmft4Q224AiBkWThPjYe8tLQSKK9J6I7DA0RxLq8/ekTS6NRkauqrZy1CE/nBViIv0jKhPUhwK9ADSFBfi/TsPvVmv5gOjssJLDiaZqyNOEz3vyfXj08SPQQ87R8+2n+RJUAQPCw7IZj8l+xXT1r+LqA8/YiF5EL8nkNTA73FOrcclaakthYyEAdg5y5i0XEMFew0OtoP1akp8C/ziHGLMv8FiO7ES2ncnhYp7vjRsra9TG7pxJ1TzIpSZRWHVHXMwRUEDLe0B0oZUzRMxxH6T6B7+YlmtZBRvtYy0WU 9RiomCk7 7TocGuOJwJHlwmiXNFCJg8782jd9J7N/kgGpUJgvBLpYGWDRpI9/23fuSiZtBNe7ntJ/IvuFEbwvReSpzqvcjsDauisIEum2/HGgUcZJslbwEuu8VqT/DQFMUkCVYLKKEK4yiOCao5WVjgnbKeKYhem7vY6w1TuYUXXrTCzb89YOmfOiFhwvQwCffUfaP3f5syr8rYF74E87dYJEUG03GfY7LOGXbLNShnsS/2xBbhNkGxCm0dW/X/cFOT9onBhZuK//i5WQsS27JbsQ0m/sWIfKPoPlGiDyGxkNo1bgMoPmohBykBvw2tFtXohNcn9sM+RUuQmwUyMc/QDSQEDzmnKhsUdsMiR1sFDgUzVzIHcOR09wr3x4ja6X7+V2u1SKEsGCu1SYXgOkGgstFIHM4S6DscbC+o5C0iAUIIEEtk1rxgY+z6QkZEh78lRdDEiEWYSx6/QqMYh9evSY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: To simplify the code logic and reduce the line number. Fixes: 5dfab109d519 ("migrate_pages: batch _unmap and _move") Signed-off-by: "Huang, Ying" Reviewed-by: Baolin Wang Cc: Hugh Dickins Cc: "Xu, Pengfei" Cc: Christoph Hellwig Cc: Stefan Roesch Cc: Tejun Heo Cc: Xin Hao Cc: Zi Yan Cc: Yang Shi Cc: Matthew Wilcox Cc: Mike Kravetz --- mm/migrate.c | 78 +++++++++++++++++++--------------------------------- 1 file changed, 28 insertions(+), 50 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 7d751d6a2c15..61009e2ae2be 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1619,9 +1619,10 @@ static int migrate_hugetlbs(struct list_head *from, new_page_t get_new_page, static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, free_page_t put_new_page, unsigned long private, enum migrate_mode mode, int reason, struct list_head *ret_folios, - struct migrate_pages_stats *stats) + struct list_head *split_folios, struct migrate_pages_stats *stats, + int nr_pass) { - int retry; + int retry = 1; int large_retry = 1; int thp_retry = 1; int nr_failed = 0; @@ -1631,21 +1632,15 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, bool is_large = false; bool is_thp = false; struct folio *folio, *folio2, *dst = NULL, *dst2; - int rc, rc_saved, nr_pages; - LIST_HEAD(split_folios); + int rc, rc_saved = 0, nr_pages; LIST_HEAD(unmap_folios); LIST_HEAD(dst_folios); bool nosplit = (reason == MR_NUMA_MISPLACED); - bool no_split_folio_counting = false; VM_WARN_ON_ONCE(mode != MIGRATE_ASYNC && !list_empty(from) && !list_is_singular(from)); -retry: - rc_saved = 0; - retry = 1; - for (pass = 0; - pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || large_retry); - pass++) { + + for (pass = 0; pass < nr_pass && (retry || large_retry); pass++) { retry = 0; large_retry = 0; thp_retry = 0; @@ -1676,7 +1671,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, if (!thp_migration_supported() && is_thp) { nr_large_failed++; stats->nr_thp_failed++; - if (!try_split_folio(folio, &split_folios)) { + if (!try_split_folio(folio, split_folios)) { stats->nr_thp_split++; continue; } @@ -1708,7 +1703,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, stats->nr_thp_failed += is_thp; /* Large folio NUMA faulting doesn't split to retry. */ if (!nosplit) { - int ret = try_split_folio(folio, &split_folios); + int ret = try_split_folio(folio, split_folios); if (!ret) { stats->nr_thp_split += is_thp; @@ -1725,18 +1720,11 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, break; } } - } else if (!no_split_folio_counting) { + } else { nr_failed++; } stats->nr_failed_pages += nr_pages + nr_retry_pages; - /* - * There might be some split folios of fail-to-migrate large - * folios left in split_folios list. Move them to ret_folios - * list so that they could be put back to the right list by - * the caller otherwise the folio refcnt will be leaked. - */ - list_splice_init(&split_folios, ret_folios); /* nr_failed isn't updated for not used */ nr_large_failed += large_retry; stats->nr_thp_failed += thp_retry; @@ -1749,7 +1737,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, if (is_large) { large_retry++; thp_retry += is_thp; - } else if (!no_split_folio_counting) { + } else { retry++; } nr_retry_pages += nr_pages; @@ -1772,7 +1760,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, if (is_large) { nr_large_failed++; stats->nr_thp_failed += is_thp; - } else if (!no_split_folio_counting) { + } else { nr_failed++; } @@ -1790,9 +1778,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, try_to_unmap_flush(); retry = 1; - for (pass = 0; - pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || large_retry); - pass++) { + for (pass = 0; pass < nr_pass && (retry || large_retry); pass++) { retry = 0; large_retry = 0; thp_retry = 0; @@ -1821,7 +1807,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, if (is_large) { large_retry++; thp_retry += is_thp; - } else if (!no_split_folio_counting) { + } else { retry++; } nr_retry_pages += nr_pages; @@ -1834,7 +1820,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, if (is_large) { nr_large_failed++; stats->nr_thp_failed += is_thp; - } else if (!no_split_folio_counting) { + } else { nr_failed++; } @@ -1871,27 +1857,6 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page, dst2 = list_next_entry(dst, lru); } - /* - * Try to migrate split folios of fail-to-migrate large folios, no - * nr_failed counting in this round, since all split folios of a - * large folio is counted as 1 failure in the first round. - */ - if (rc >= 0 && !list_empty(&split_folios)) { - /* - * Move non-migrated folios (after NR_MAX_MIGRATE_PAGES_RETRY - * retries) to ret_folios to avoid migrating them again. - */ - list_splice_init(from, ret_folios); - list_splice_init(&split_folios, from); - /* - * Force async mode to avoid to wait lock or bit when we have - * locked more than one folios. - */ - mode = MIGRATE_ASYNC; - no_split_folio_counting = true; - goto retry; - } - return rc; } @@ -1930,6 +1895,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, struct folio *folio, *folio2; LIST_HEAD(folios); LIST_HEAD(ret_folios); + LIST_HEAD(split_folios); struct migrate_pages_stats stats; trace_mm_migrate_pages_start(mode, reason); @@ -1963,12 +1929,24 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, else list_splice_init(from, &folios); rc = migrate_pages_batch(&folios, get_new_page, put_new_page, private, - mode, reason, &ret_folios, &stats); + mode, reason, &ret_folios, &split_folios, &stats, + NR_MAX_MIGRATE_PAGES_RETRY); list_splice_tail_init(&folios, &ret_folios); if (rc < 0) { rc_gather = rc; + list_splice_tail(&split_folios, &ret_folios); goto out; } + if (!list_empty(&split_folios)) { + /* + * Failure isn't counted since all split folios of a large folio + * is counted as 1 failure already. And, we only try to migrate + * with minimal effort, force MIGRATE_ASYNC mode and retry once. + */ + migrate_pages_batch(&split_folios, get_new_page, put_new_page, private, + MIGRATE_ASYNC, reason, &ret_folios, NULL, &stats, 1); + list_splice_tail_init(&split_folios, &ret_folios); + } rc_gather += rc; if (!list_empty(from)) goto again;