From patchwork Tue Feb 11 15:50:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zi Yan X-Patchwork-Id: 13969553 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 66A6DC021A2 for ; Tue, 11 Feb 2025 15:51:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D63136B008A; Tue, 11 Feb 2025 10:51:02 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id CC3976B008C; Tue, 11 Feb 2025 10:51:02 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ACA956B0092; Tue, 11 Feb 2025 10:51:02 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 6D7576B008A for ; Tue, 11 Feb 2025 10:51:02 -0500 (EST) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id D8385A048E for ; Tue, 11 Feb 2025 15:51:01 +0000 (UTC) X-FDA: 83108102322.12.CC0BA5D Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2059.outbound.protection.outlook.com [40.107.101.59]) by imf04.hostedemail.com (Postfix) with ESMTP id D450640008 for ; Tue, 11 Feb 2025 15:50:58 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=RsjMpRJG; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf04.hostedemail.com: domain of ziy@nvidia.com designates 40.107.101.59 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1739289059; a=rsa-sha256; cv=pass; b=mBH0B47V+t7LKrwnbaQ02iwQpmtQiYWneKELwUI/88NToGZaVpTpb69dpgs2Kylc/9kKC4 yYM8RmkYVljYzVb3UXw6xiW+jfGXaVYPtlQKDrE7qllicJGsXhE6f9swptCNf7j1lrqD3D X41Wnq4tIf/cJdYimjChq+tPwq//U9c= ARC-Authentication-Results: i=2; imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=RsjMpRJG; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf04.hostedemail.com: domain of ziy@nvidia.com designates 40.107.101.59 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739289059; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yuOu3UvZiN76u19j7iEAZ8tEqhdU5MyeEFsCLje7ZZU=; b=8n5ftn4nIc37/Cv1QZm9ojJZa3RExnhAEiAVodzpadVNfLx2VSEbFgxwjbwJV0D1eY39Pp ozoUm9bJERutcUNgJNW9snlpKs8Gs/fuKiSjVgpNizrEAnhwBDkIFBx2yWSSIGL1XulKoT ijAOUJLnteDto1cO458nl2Tt+sdzQIo= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fPPks8wZSXGy5lyf63En28CUuwb/ezkqCtjWrKZAhiUvjdLhEMIhR/hYmD3epDgxIiHIzQqS2ieE024wamw+N6jloktaa8QkeENHrE3kK+J5RW01oWR2WTFVVtGdoIm1TbsbgjHzBpQME5gxOOZYlWWk5qKN/zXEdtEZHaAAoaQvsNzvw5uhFTrIjMJvkUc3Yz9gajIIHHrEyFvDqZBZq8PnFCyR1907nln1HFlL3RNbKN08SkExD7EE1iusn+uFV9RwHZx5HQRz8wCWlTWlxISsb4Zidjnzow0KIXbVwmqH2Bh6XAD0/jTzu/5geMJ+X6N7z0cNJbmeLv2wst/6Vg== 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=yuOu3UvZiN76u19j7iEAZ8tEqhdU5MyeEFsCLje7ZZU=; b=xxOgz1YBMlXYPX2mG3qZiUwKwPL8ZcLgJRzc2XtcVYgZejl/lE9HpaJzzMLyxKFqKtK/Q7LxlEDPtNzdvSPvanXZy5jn6G7NWwF2c250K4RX8GPdMiSCmJzkQwy0mXSNxkys1Qfr6/miAifvkfDx9r9drL+TIUtEpDqgqAR7Bv4B0BR3RyesjEDWt0uudTe5FHq6Ns6GWrWji37C9DxuSY5fHN0S4TNDOAsmjlrvtu42LQv24mEuJKJBfsCpnSqRK8LfFvpt6bKTt7FohGVR2kNpSM727YabCfbXCFePqLljBg2kLD1gfG60kdTMzW4vaYgUdBzdY6GEHufJczGYgg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yuOu3UvZiN76u19j7iEAZ8tEqhdU5MyeEFsCLje7ZZU=; b=RsjMpRJGQbUhmSuYhIiInUGttWqifejW1dbs1/3lCtHTs/8eeUjpGChkChn1Vqo5vg7ildMkqPNvCGNGkAw9zv45fx8mU4Pb/zO7iqWiCy6scOGJ7HOmfgREwA+ewUwqTi1MVwEAFC+Yb9ouJtFBz98fPoCpqQIQFF4Z9fbPO6H71Ki4SkgQIdUOO3cRbi8PSCutOeKaFMCdS/bfM+v8f0h9rlDdWhDUK4P6qtkK3Dq6jgXOSN5P+6c5/Ey9f6+pyS3yX4LkxGaJ/K2x6QRp/YJQ7YM4Wt/YmG0XP4jl+asOXSNbWNKH3MT0kptVm4im/uesf07In3jbcLOaZrkhYw== Received: from DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) by SA3PR12MB8764.namprd12.prod.outlook.com (2603:10b6:806:317::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.19; Tue, 11 Feb 2025 15:50:46 +0000 Received: from DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a]) by DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a%5]) with mapi id 15.20.8422.015; Tue, 11 Feb 2025 15:50:46 +0000 From: Zi Yan To: linux-mm@kvack.org, Andrew Morton , "Kirill A . Shutemov" , "Matthew Wilcox (Oracle)" Cc: Ryan Roberts , Hugh Dickins , David Hildenbrand , Yang Shi , Miaohe Lin , Kefeng Wang , Yu Zhao , John Hubbard , Baolin Wang , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Zi Yan Subject: [PATCH v7 3/8] mm/huge_memory: move folio split common code to __folio_split() Date: Tue, 11 Feb 2025 10:50:28 -0500 Message-ID: <20250211155034.268962-4-ziy@nvidia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250211155034.268962-1-ziy@nvidia.com> References: <20250211155034.268962-1-ziy@nvidia.com> X-ClientProxiedBy: MN0PR04CA0015.namprd04.prod.outlook.com (2603:10b6:208:52d::26) To DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB9473:EE_|SA3PR12MB8764:EE_ X-MS-Office365-Filtering-Correlation-Id: b3c7c332-863b-4e5e-3d74-08dd4ab3d92a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|366016; X-Microsoft-Antispam-Message-Info: Ix8WiW0Ar+tDPTwzGDWmXL/KFKI0czkKM1l1zDxBvfLhzcFDqTI9L4acXqjinai2qYtrLULWM3gfd8CDpT01npFJIyIZ5a9yZsSpP1d7GJCLOnS4IxQtx9jOmkUSSPyXrAYUEAckv8xLiLRFJGbEuElFy6y02XCTIYXlDXFM3CfDVltA01UQRxFzTWyWxYDmWUPfxNZwY9IEe8n8qYej1AP28o6snJtYkitNT54ZeeUjUMFy49d7MWzT4Z2Auvt4XLTFzzAqzt7YjTcCeIVMnwh5FlMYvTBXMOJvhXJpwvTiBBQvUIOZGFvI9w3R0+RJa1UK2Tdhg87lVq6rM66qevOZibKOYMHIlQsKtmpaSMhQZpsojvAql3KLsySSrOo/Nn/ASPpEm9pgCkf9SY7GBo+r52gswJ7eSbC8RSpqhPIijOpJuRvF70zxv4Tf3lreNadVsXBYZeeFIeqPD566XUV/TR4rRNcjJ+96x+2wsxoREyyze6o5xIbAWbMX7MncSD0GVeKzzTPnTZHQcoim9fJckeJ9rUu386vEv2Wf/3U6yzZLv5DAphECUvcvspGVKnmtlD0LH4iwSARUf5nHjO67+nQ00D1n8jyk0e1K4Z5tH+bkJedy7O40SrbXm/Y/+FCGR5zkp7uIrLoIkUkhhOijMy+4cYeXwzaCfFr8TKgK5FeD3Ax5rotYYgvX3g6y/7WhiMWKuqupUKrlZRy/kiyTO34OvgYly6vKMgYoLP3jyBkkIfEWvF6O3FchIFaZWCr4hQYgtA4jWC/kdxCtgi8h1EXPAEPa/fvcOOXdtRO4mC7i3Gl+pWA5wPPCBBEPmK8v6+OfEqbGQ8pSa5Bcevhf1Jk7Bc3nClI9qpsEnqUXhuwDTFtqAh1QjGq0plmxQN24Ru4kc61SxBX+rsTdEN7Gorv1n5BN9zrFe/P6SX2mEWYvPuH776FjWEoZpOOht+/wtuOUj54UDKkNcQNXLFoyIzPbqbFOQ0bIaPfEraD7t0vxv2MuulI8s0nLixD7QAv+rtpAw6s+RTe7jCRBHJJdLToy1pTandMwuoUestLYj7yxl3YH+Hvpx/P+VPGvDp3yrXjbsvxY1sUuF8QU8EoVwqnSLjRNtlS+QwzXMNmHk0AhjncmiIlN1q6AKkJQRbIPn6/9X4xniGkfrqvmnZxo5RqtjxqysUtpGjb1mav9gnWjTUbwyPEs9N5v8fI38bHa3cwyR4mH1Vd8qfrnLpYwtBBoR+ViXdUp9wf06sHDTSJ6rk8SZmZhy/dCJ67qo5ibCvzyUPQ/kTsWzIcek1p77O0S+XPQq2P6ci5Y6ddKKq4vhOK6CQRUBJLNyHP7WM8GHA/8PIDUZcb+x5hY/W/0PNqj/ov5YZsKwLOmPP3ko4lzKfEv65PhJHiMAVUh X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS7PR12MB9473.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: rR+dqhMOTw1PlFJ0dL70/uf9Rm1Okj0BZcB4W4u0d3cSFvgdGUfbbhHd8/SLzDjVdfRozIW2vV6dbB7eTFcaR8ckk8vz5b5InaMUjPTVULKfjIMwIuD7tCU0XANLUPYxQilsva5awQuae8qgbChlit6OOwoBNWHUAJg/UTpB97cP7Egrc7+3TJCzgjChfuRTYXaAvxy+Y58kQMpLfK8AfTV+yMCdTIv9jcNuiXrtQBVTG3Vn/6+kmC/NneB1Do33969hrUYCOFL3xdtDCFtyxGkmv1v0d4Za3b7ewdJqXkcqWIC1XPe5+GNG9m64KQj+L5+JtS5F4dtOblDrvguBQ8IEzNcyz7ucTO6EP7C9dZNzyUMirQCINxUb14dlp0XPSVgpLleP8ezHiqVnVyQHsEv6UjVjPuqa2/hUw/JFr8n0mXK1ebKKNJVoTdKmr4pttG1HHO0WSkvQCV8Tg04cmgp4297aiaS037SOyEAQp7OYMw65LDgzDP2GonUzRPxbBX6HEBaUysLgQZ2f96fv0dzzgWNZ6OekKZt8UmrN7vHV/aoG70npIFxVlHs+/X0hUOCJU9O3l05ToL4T4WXrU+r+QYT4RBeqb1cg3Drp5+Auz/E04GuWDri6JE3iCogzcRWwqvtSB6Q1yE/JHYHp3NGmO1ll6KM+BzNVUrAqPD5lPixB4iVoBBZvsQc6oGQwtLbfl26z5HW7vm0Iw3wOry5FqsolpMoVUZcmBZ9/Cr5KLUdfSoLciSXiQtjv1BBXL/1CxaM500Fn1BT4A1OX5kWtJ1fsvexqjZvS28pCsjJIPhkMqCyJNd4p4W0PVjWYh53w3a8tkLBr4i/LxiMEIZ+o4bPfBqX7yKxbSbqDik4Yq5iL38pBGW37zy+0zZu26CpNXv3vq/WXk9Z22myZnRnzCrOuhZ+TqlZBRb05gu+rVCqUrdcM/dsQG0dt+HHecdi4SQKM/0SxzqYRHJPpWtY3SrBYWoyKZ92EP48M++oBj8X+lDELERvPoLYfK0Tfzn2w/COtljGNac5q5aEmD02T6XM+Xn10zZJLEAO1tNRZMpJCztfzDaKVj2GA2tLudtq/e+xD1IMt1a7wWifQnHanvXFLqufews78vXNG5oOrj/YywD/ePkDhEDS+NeqTnMsji2rci3ZZbbd6o3ZaJdRMu72ZA2Gy9RdCel/3jN+ShGxfu9desfKdFUQBmZYoxWItLx0h9PR1acqsrbJ6Nx6i++/FI61Q8i5IFt5XAdCpNMrcdFw5uV5YLJiezeOtQC5nIlvZoClCM8kE0uoC4JifFHMBHx97j6ga5iQ86WVMVWFWdXZYpq2I0Clp9RJnAO/EPcyHVst1crVtyH4xC9JKE/YKbmCeDm43VIuUK/gz0TdGoq6M2veKfMSsxTWhQMfd38szQcl3MTjOE/b+i+LzURofFHJWtgJDYiNXyuO7ovzMWbzEV0XoOYDWXe8y/9YgMxMoe1LOeKnd152RX4ceIq7KOL6q6ASc8a9KYqy9JSEGEr4lThHGKZ4/FC9WSm88hR1WI5f7QSojjXh9Sld7E5FsO6g9vE9BYtSBum5mlRLmGmkLPZ/Rp/0NO9gF X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b3c7c332-863b-4e5e-3d74-08dd4ab3d92a X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Feb 2025 15:50:46.1109 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: q0O6OAl+vks9tdzyZeulQeyfu6JwpCAN5gVxYlGeA6ss4L5FVTq3YgTgJFxNz60Z X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB8764 X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: D450640008 X-Stat-Signature: wkjc3bdfa76ds11cdyu6suh38cukaft4 X-Rspam-User: X-HE-Tag: 1739289058-803690 X-HE-Meta: U2FsdGVkX1/uA6owvslmMY1qZqzCCmLtUwZ2IXaSj2BNuNQg6S3uyPR8h1JJY2SlZ3qlBCbra/4csQFbq7Tu+KrDL/G4Yik2HGX990gSvtKO7Urra9g5YLeT5sdOCvt4Ion7PAApbUPKKQU0hMVGCs7ntY9Vysj+veZnN4X4LhB9JMcmvLk/y0xkDuHboFY4lGHt3DcOppPr3ebiCs/7aevdrnuup/AhjoJeesrq4F7P+GpP6UQYOByBWR3bwUrEg38qyzVAeGq14FQSc5uFZWgrIejPLwXOplriPoDnFJwpbwDq5mrEDy5jn40BEkGkh9Ux7I3rclmuDFmPiW7bE8SaDFaBR2hWdVlEiiZhNGoQTl85kNm426kQV+dRLmw2Rq30Il2faNS7YZx3D6RvDpxlsgQHNAHA8VuoHfchN6y8qFcexJtvMQSruzDdbsl8V5aP8vz0QgtsDbaYltfIl3GUyhwhIdHhUu65+BlkxHlbhrQ4h8kY2ggwLBbdNe4ZUyj01G53CjuXENLQ/7m+NbP9VTiUYtPCisVQqkTanQoG44CKEJDK27NUYzkIblrTHRE8fKy7F4nMKty1ucOF3MYxqtZWp67AraG8f4SfQFiNBqb1x1y0waoTVIechaYH4b4Q4yyJ3sWCQqNw0saVWdQcgD9EfAbr4Of9qra0jM8ccwm20Zzy2+i4I4uaZ2zajG0InFQwI73cMd3vrRonz6oKHbSu1JaWNATwVk42pNwZ0SNtAc9ByXJLn5ZU7ODp/oJpXIznrlytj90XgVRLJeYiGpIF7bz/bQjzvArnwz0YXBuvi17dACjX+9Ov8GbrRREKfZxHUYZVPHEuZVWWndvQoUe/nPT/L398+l2E7QKiRB9TYuxJSb4zpuBsKXsh+/eSrzi5Dbu2y7OXq84BaPt99WrSoaB3HA/tSMKjSlXvJ+QRkG+MgQfk60D/EXBJ0Hoa8Y33+gK4kZQw16b TlMHf9zx PLjXMbqH7Wmg5GQG9KSLf1OYF8oLGgcr3oAyBlVeuGhOqQeyPKKo5Fxgqxy83Ag/JXUwx6n79N27iWYVyeZuvOkozrlz3YsfhFPa9I/25LRRBuhmY+Ipxt0Y4Fxd4U93oSYjVPmQLF2b/IRwn+HMXZSEoLAxtmGCIscoYG35vDLtP9t7yWgmAR4ppmXKQ3osk7KuxYCyNnvu4y87ly3/nGfWusmaMKtvx6K0xgDGWntnJLVwrvzcoFFOJ+QSEtaJMvSAiccUj04wtiJ4iFXYhksgyYzCrYD/bZlMQk9tsGHPqDcRI4Wt2O+uT5O79gk+zNi+yv/x58GST0D8Np1XMGodmFNR0B3K9NpG3ghifIzkziTuDenoO64kjraUzSuu5Qb7L1cO6R5BXRMY= 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: List-Subscribe: List-Unsubscribe: This is a preparation patch for folio_split(). In the upcoming patch folio_split() will share folio unmapping and remapping code with split_huge_page_to_list_to_order(), so move the code to a common function __folio_split() first. Signed-off-by: Zi Yan --- mm/huge_memory.c | 107 +++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 12d3f515c408..21ebe2dec5a4 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3853,57 +3853,9 @@ static int __split_unmapped_folio(struct folio *folio, int new_order, return ret; } -/* - * This function splits a large folio into smaller folios of order @new_order. - * @page can point to any page of the large folio to split. The split operation - * does not change the position of @page. - * - * Prerequisites: - * - * 1) The caller must hold a reference on the @page's owning folio, also known - * as the large folio. - * - * 2) The large folio must be locked. - * - * 3) The folio must not be pinned. Any unexpected folio references, including - * GUP pins, will result in the folio not getting split; instead, the caller - * will receive an -EAGAIN. - * - * 4) @new_order > 1, usually. Splitting to order-1 anonymous folios is not - * supported for non-file-backed folios, because folio->_deferred_list, which - * is used by partially mapped folios, is stored in subpage 2, but an order-1 - * folio only has subpages 0 and 1. File-backed order-1 folios are supported, - * since they do not use _deferred_list. - * - * After splitting, the caller's folio reference will be transferred to @page, - * resulting in a raised refcount of @page after this call. The other pages may - * be freed if they are not mapped. - * - * If @list is null, tail pages will be added to LRU list, otherwise, to @list. - * - * Pages in @new_order will inherit the mapping, flags, and so on from the - * huge page. - * - * Returns 0 if the huge page was split successfully. - * - * Returns -EAGAIN if the folio has unexpected reference (e.g., GUP) or if - * the folio was concurrently removed from the page cache. - * - * Returns -EBUSY when trying to split the huge zeropage, if the folio is - * under writeback, if fs-specific folio metadata cannot currently be - * released, or if some unexpected race happened (e.g., anon VMA disappeared, - * truncation). - * - * Callers should ensure that the order respects the address space mapping - * min-order if one is set for non-anonymous folios. - * - * Returns -EINVAL when trying to split to an order that is incompatible - * with the folio. Splitting to order 0 is compatible with all folios. - */ -int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, - unsigned int new_order) +static int __folio_split(struct folio *folio, unsigned int new_order, + struct page *page, struct list_head *list) { - struct folio *folio = page_folio(page); struct deferred_split *ds_queue = get_deferred_split_queue(folio); /* reset xarray order to new order after split */ XA_STATE_ORDER(xas, &folio->mapping->i_pages, folio->index, new_order); @@ -4113,6 +4065,61 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, return ret; } +/* + * This function splits a large folio into smaller folios of order @new_order. + * @page can point to any page of the large folio to split. The split operation + * does not change the position of @page. + * + * Prerequisites: + * + * 1) The caller must hold a reference on the @page's owning folio, also known + * as the large folio. + * + * 2) The large folio must be locked. + * + * 3) The folio must not be pinned. Any unexpected folio references, including + * GUP pins, will result in the folio not getting split; instead, the caller + * will receive an -EAGAIN. + * + * 4) @new_order > 1, usually. Splitting to order-1 anonymous folios is not + * supported for non-file-backed folios, because folio->_deferred_list, which + * is used by partially mapped folios, is stored in subpage 2, but an order-1 + * folio only has subpages 0 and 1. File-backed order-1 folios are supported, + * since they do not use _deferred_list. + * + * After splitting, the caller's folio reference will be transferred to @page, + * resulting in a raised refcount of @page after this call. The other pages may + * be freed if they are not mapped. + * + * If @list is null, tail pages will be added to LRU list, otherwise, to @list. + * + * Pages in @new_order will inherit the mapping, flags, and so on from the + * huge page. + * + * Returns 0 if the huge page was split successfully. + * + * Returns -EAGAIN if the folio has unexpected reference (e.g., GUP) or if + * the folio was concurrently removed from the page cache. + * + * Returns -EBUSY when trying to split the huge zeropage, if the folio is + * under writeback, if fs-specific folio metadata cannot currently be + * released, or if some unexpected race happened (e.g., anon VMA disappeared, + * truncation). + * + * Callers should ensure that the order respects the address space mapping + * min-order if one is set for non-anonymous folios. + * + * Returns -EINVAL when trying to split to an order that is incompatible + * with the folio. Splitting to order 0 is compatible with all folios. + */ +int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, + unsigned int new_order) +{ + struct folio *folio = page_folio(page); + + return __folio_split(folio, new_order, page, list); +} + int min_order_for_split(struct folio *folio) { if (folio_test_anon(folio))