From nobody Thu Apr 2 17:16:02 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013061.outbound.protection.outlook.com [40.107.201.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E0213AE6F4 for ; Mon, 9 Mar 2026 12:10:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773058255; cv=fail; b=ib5qjOsK8hnVuQoT0agmNXn2wDHl2nQQr/o7d34r5sumGm8xmSdTvGTTppHeQDHtwPPZQiwt0Fyw6uF1EtxxkOi8Vc37dYqIW/qE8bG4NRsFdsbR7XK18qXIpwEbwOJ0N4G6PsrO2Ra3FifHyF7KTBpsGvwuLk6VGvByyy/C9bQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773058255; c=relaxed/simple; bh=DShRU6/SccYurpofi2eBGJ1LoxzwBE0wmX6JIMe4054=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WGQiVWtstrXFT1JLFsza9bcIkAdVKB30YXPiYudMIc/eZsurQ/oTcAo0fPqRNvhU3OBmKiRs3ccgIwMn+WUQFC8yWICZC0ByVH6c2TXOtiVq5rzlT9ZBI8QoSexyAqW3iyfEkXkj/HE01dZO4EaOB4wHFh2nYBcn1Ksgxm/zrPI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=w51oS2IC; arc=fail smtp.client-ip=40.107.201.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="w51oS2IC" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gspqNw3/YWNojasuAG6dNB5Z5fiuObhjWCBmDB7HT3rU5muLHB15J0cZRc6FppNUvE/ga9J+6/jTOkYLZ1xQY4NoSX2kyD/yoSKrOJUcDWeKI/nw8cghdTL0j7G7ijPVTqxrH/PYZbEz9U36/gJ4cgCiE/4LxbfsbTE4+2RV7iLFWZy3eCG34cLquRK7U0bU3XU/jTj6lG0PUA62qs2dRsrHbNEL0w/5Hw9X3oCfuaZBtkZ1CHqvaFzp/O6OQJnIlF473l9HXfeZQmgC0G/RMO8giEWlni+DX8+0ukwcTLxCGKQPPOj8dhSS+VuXCaduWs8yM3lr7dts0ksEJiUvgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+ckxzWdnuNZQ4fZmUPlhcSIRDDo0vDlZKadKfM6hydE=; b=sbjZzMBkKjOSv2qj/0zxf0Bg+jp8w2jFyZUaAGCsbyl+UxqMhl/wkEAUzPPt0xy3Wit+oLQKWKKD2Utp0cKZQx4rhPUzDHRx6KJM4BWJbDQHhXA1AhhJ89+GDVOfxQeR86AKPasxrJTbVx1OcZc9+TXWpkXqAOt7ZrEwJEDIVw+7z7Oh658yGdADMwziurHwhxOhdcEDkncTmkd192j5qN9elLSC+dwDaclPPomJqvgtRRS9TwFQpPbyxqWQ/suYhCj2iou3syAt82locbgST5aGgBPaEkpM9PRaz9AKFCbULepHZXYYARPsFZf8HRePHSCEscWWC/s/9qv+QP2rag== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux-foundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+ckxzWdnuNZQ4fZmUPlhcSIRDDo0vDlZKadKfM6hydE=; b=w51oS2ICua6DFgjf9y6TxBJMhMrSc4CxKcQ/9aoOoOZpMPzBFY+335Vw9gXCQ/sFBx4ANPwzCmDSZ85/vyGoA/oqi8N0QSC2qDtK4SoJtWn0qxdHheSDCsQvOIjWVcyIOsIVshSr/VlzIC+rHTvI31Xz+f2ZQiGOCmHbBTjtvZQ= Received: from SN7PR04CA0162.namprd04.prod.outlook.com (2603:10b6:806:125::17) by SJ2PR12MB8109.namprd12.prod.outlook.com (2603:10b6:a03:4f5::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.10; Mon, 9 Mar 2026 12:10:45 +0000 Received: from SA2PEPF00001508.namprd04.prod.outlook.com (2603:10b6:806:125:cafe::56) by SN7PR04CA0162.outlook.office365.com (2603:10b6:806:125::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9678.24 via Frontend Transport; Mon, 9 Mar 2026 12:10:31 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SA2PEPF00001508.mail.protection.outlook.com (10.167.242.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.18 via Frontend Transport; Mon, 9 Mar 2026 12:10:44 +0000 Received: from satlexmb10.amd.com (10.181.42.219) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 9 Mar 2026 07:10:44 -0500 Received: from kaveri.amd.com (10.180.168.240) by satlexmb10.amd.com (10.181.42.219) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 9 Mar 2026 07:10:33 -0500 From: Shivank Garg To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Shivank Garg Subject: [RFC PATCH v4 3/6] mm/migrate: add batch-copy path in migrate_pages_batch Date: Mon, 9 Mar 2026 12:07:27 +0000 Message-ID: <20260309120725.308854-10-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260309120725.308854-3-shivankg@amd.com> References: <20260309120725.308854-3-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb10.amd.com (10.181.42.219) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00001508:EE_|SJ2PR12MB8109:EE_ X-MS-Office365-Filtering-Correlation-Id: 49ce63cc-c22e-4d32-0bd9-08de7dd4e44c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|82310400026|36860700016|1800799024; X-Microsoft-Antispam-Message-Info: bkn16Fksyow1DK9CkLTVmegDvHDprXzI6QASjAFTBAXklFZdDR0W6Ao/p9DjTs9msHLXOdzSojIDlUl0OpzO4UArBflFF6bA3Wy059eOj9apeuzPyjG7yVi+s6ZdYp85s9wWwZFE2Oj48ZK/aq+4EVkjhoGk/Qjj7U3jnMk793TYEL2CtQfu6Jr4OeZFgzswcszlABnVjlyew3RbQ2vsG5VdwiF+BKfsboOAT1hGUZ+10FCtB/f0U3UO0bzopDyNozFuIGnmI74M0RADzWd5/OJ6N4HzsuSGSWEr/Yu36RQ+Vi9T0STeaQ7m0b+15ziEhfn58yXZIUwQMA6FcnqlU5lQGnTgZzHqNnx+n0SF5HjKebAw7knfEvPZ22dxtCSArJQciLgnQt67Pdq8QB+3CZRLqWVQt070z/GioSG49aPafpKnQ1snXJ6WQsoBz4xsR55T6/K6Ywp2IK35bnFlLj2LZzC9cdM/D0jKcI0H7JxzIUJTirsnipaWTcYij5d4rZNRuVrbHtYXKZpxsFDgbHVGR7rNy1WmT1gm1XR5hfUuSimg8RYuZ/0F+D6eUz4oCTG6LmhPpQUgfFJk7hGJLpeQavcf2woZsk7Bg/VWyewk8oz/tbOMXLj+TnKm1Gid6qRgO7wl5C+GXShTIg8N+3xJP5aAmk5TGeCQoFzdSzz4o+nRkTqEa1wfQN9G0wVG6LXSLvqIJux0xBUrttuuy18nqC91NDHhmeXRNG7jdN1AJw1l6u2TkgbdbVENu+nIGd5ilLUGfP5nb1BIA4tAeA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(82310400026)(36860700016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: V5ALtRDgL2OtsDRXVxuoQphbPqd5+Hts0TJRZemfzql3YH4MJ49r1Oo7lsotRVNcFTGBHuqWQ2SuaO25mT+GR5SjRPB5W3kzbxVWoFq34GUoKgofxNECTlbfVp7d5qSlwXj2h5n7kg50pUCz5DCqIbGEby3KWDoT9QuW7xYB+GzzmMEZwoH2VYy6BjH35Q0GCdIDDug3lnORncTimwe0wbANRo0vszLjSVeTktJJWg29rbrpsQKS0ghBoOgV+P7XlWGkfG7KMxNq6yXpwYrH4vPN7LcF0CVtHtGPwe54w2ya5YqIE7kGnDkAo5ZTdHXsfOkbCQ8u464m0u4L9x6xISTXqaHKrTldxQWc2E9QKy/8XovPvyfn7mc+t3BukOz9dmXkA1ucdbyUXZmZH/N719LXaWAZg+eMYG7WBFI5yw+MNvyxanMFKx1vS1/7Tf2Y X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Mar 2026 12:10:44.9259 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 49ce63cc-c22e-4d32-0bd9-08de7dd4e44c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SA2PEPF00001508.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8109 Content-Type: text/plain; charset="utf-8" Split unmapped folios into batch-eligible (src_batch/dst_batch) and standard (src_std/dst_std) lists, gated by the migrate_offload_enabled which is off by default. So, when no offload driver is active, the branch is never taken and everything goes through the standard path. After TLB flush, batch copy the eligible folios via folios_mc_copy() and pass already_copied=3Dtrue into migrate_folios_move() so __migrate_folio() skips the per-folio copy. On batch copy failure, already_copied flag stays false and each folio fall back to individual copy. Signed-off-by: Shivank Garg --- mm/migrate.c | 55 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 1d8c1fb627c9..69daa16f9cf3 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -43,6 +43,7 @@ #include #include #include +#include =20 #include =20 @@ -51,6 +52,8 @@ #include "internal.h" #include "swap.h" =20 +DEFINE_STATIC_KEY_FALSE(migrate_offload_enabled); + static const struct movable_operations *offline_movable_ops; static const struct movable_operations *zsmalloc_movable_ops; =20 @@ -1706,6 +1709,12 @@ static int migrate_hugetlbs(struct list_head *from, = new_folio_t get_new_folio, return nr_failed; } =20 +/* movable_ops folios have their own migrate path */ +static bool folio_supports_batch_copy(struct folio *folio) +{ + return likely(!page_has_movable_ops(&folio->page)); +} + static void migrate_folios_move(struct list_head *src_folios, struct list_head *dst_folios, free_folio_t put_new_folio, unsigned long private, @@ -1805,8 +1814,12 @@ static int migrate_pages_batch(struct list_head *fro= m, bool is_large =3D false; struct folio *folio, *folio2, *dst =3D NULL; int rc, rc_saved =3D 0, nr_pages; - LIST_HEAD(unmap_folios); - LIST_HEAD(dst_folios); + unsigned int nr_batch =3D 0; + bool batch_copied =3D false; + LIST_HEAD(src_batch); + LIST_HEAD(dst_batch); + LIST_HEAD(src_std); + LIST_HEAD(dst_std); bool nosplit =3D (reason =3D=3D MR_NUMA_MISPLACED); =20 VM_WARN_ON_ONCE(mode !=3D MIGRATE_ASYNC && @@ -1943,7 +1956,7 @@ static int migrate_pages_batch(struct list_head *from, /* nr_failed isn't updated for not used */ stats->nr_thp_failed +=3D thp_retry; rc_saved =3D rc; - if (list_empty(&unmap_folios)) + if (list_empty(&src_batch) && list_empty(&src_std)) goto out; else goto move; @@ -1953,8 +1966,15 @@ static int migrate_pages_batch(struct list_head *fro= m, nr_retry_pages +=3D nr_pages; break; case 0: - list_move_tail(&folio->lru, &unmap_folios); - list_add_tail(&dst->lru, &dst_folios); + if (static_branch_unlikely(&migrate_offload_enabled) && + folio_supports_batch_copy(folio)) { + list_move_tail(&folio->lru, &src_batch); + list_add_tail(&dst->lru, &dst_batch); + nr_batch++; + } else { + list_move_tail(&folio->lru, &src_std); + list_add_tail(&dst->lru, &dst_std); + } break; default: /* @@ -1977,17 +1997,28 @@ static int migrate_pages_batch(struct list_head *fr= om, /* Flush TLBs for all unmapped folios */ try_to_unmap_flush(); =20 + /* Batch-copy eligible folios before the move phase */ + if (!list_empty(&src_batch)) { + rc =3D folios_mc_copy(&dst_batch, &src_batch, nr_batch); + batch_copied =3D (rc =3D=3D 0); + } + retry =3D 1; for (pass =3D 0; pass < nr_pass && retry; pass++) { retry =3D 0; thp_retry =3D 0; nr_retry_pages =3D 0; =20 - /* Move the unmapped folios */ - migrate_folios_move(&unmap_folios, &dst_folios, - put_new_folio, private, mode, reason, - ret_folios, stats, &retry, &thp_retry, - &nr_failed, &nr_retry_pages, false); + if (!list_empty(&src_batch)) + migrate_folios_move(&src_batch, &dst_batch, put_new_folio, + private, mode, reason, ret_folios, stats, + &retry, &thp_retry, &nr_failed, + &nr_retry_pages, batch_copied); + if (!list_empty(&src_std)) + migrate_folios_move(&src_std, &dst_std, put_new_folio, + private, mode, reason, ret_folios, stats, + &retry, &thp_retry, &nr_failed, + &nr_retry_pages, false); } nr_failed +=3D retry; stats->nr_thp_failed +=3D thp_retry; @@ -1996,7 +2027,9 @@ static int migrate_pages_batch(struct list_head *from, rc =3D rc_saved ? : nr_failed; out: /* Cleanup remaining folios */ - migrate_folios_undo(&unmap_folios, &dst_folios, + migrate_folios_undo(&src_batch, &dst_batch, + put_new_folio, private, ret_folios); + migrate_folios_undo(&src_std, &dst_std, put_new_folio, private, ret_folios); =20 return rc; --=20 2.43.0