From patchwork Fri Nov 1 15:03:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zi Yan X-Patchwork-Id: 13859512 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 3D57CE6F066 for ; Fri, 1 Nov 2024 15:04:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C21C06B0089; Fri, 1 Nov 2024 11:04:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BD4036B0096; Fri, 1 Nov 2024 11:04:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 938076B0095; Fri, 1 Nov 2024 11:04:21 -0400 (EDT) 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 624426B0088 for ; Fri, 1 Nov 2024 11:04:21 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id EBE281A069A for ; Fri, 1 Nov 2024 15:04:20 +0000 (UTC) X-FDA: 82737845190.20.4DF90FD Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2088.outbound.protection.outlook.com [40.107.93.88]) by imf04.hostedemail.com (Postfix) with ESMTP id 082B140029 for ; Fri, 1 Nov 2024 15:03:41 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=ljC0i1Hy; 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.93.88 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1730473401; a=rsa-sha256; cv=pass; b=JMX8gQRCdLrN9Cc9EOiKMU+CgPNoDo1G3hB6krjdhZwFYBf1cZ2bm+pQusKpBRD5TQ9M8w tnwHZM0V+hGQI5rzn0qqsFwX3qoPqrHB4UVRpG2GTCvcQNkLQpiBQX+vgheg7jYWyecpTV OMUOwbsrU+LV2GUZPit5szNt6CueGfQ= ARC-Authentication-Results: i=2; imf04.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=ljC0i1Hy; 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.93.88 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=1730473401; 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=Ls+U6Awbsximkn/QkNJbncmd3R1uDypxcexS3nCzLLo=; b=uPf4SvCpwbWn33ysEObgTxQBT0/U9dDnSUZce2Y7YK/IwhfCsboOtOdpuVOz+QBNQeGgyZ gaY8aW5onmB2Ob6/VoLwL3nF5jR+UJmxwiy4IEqqU+PdCA5PCF5nvThEQqeif+Fo8ajTUh IuM/oxH4+WVBMG0Slt70USHMpCiqMn0= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=k62DSH0vuRFqfyFHGdTrWLaZSUXJ1466kLuBPxbT88gv2Z33SqBmKew1KRAkykXF4hquWGpbP6hSoBiP1cCwUIGr7YIjIIrlWJiESkfp9AHYQfkkO3dK/mNw0auXsG39QuuDJU7XZzfhfmgtg2HTlyc40Ad0c8gUsfCK5ERbUQBqVeiMh8IusVWDLcY+ZfE0EbJOaEH1jYU314DUxe7CzsFUDOlBddfFUP33q/TMfHuIKciS+cgcDnC8jnZNrqxy3RB4MTMa0NKq2TKg/VieX8Y6SPiYfalOnlcqNwgz6Qc1U9ThLrymxNs19VjQZDHNheJ7xJgLQ3rQQdSl9DkB/g== 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=Ls+U6Awbsximkn/QkNJbncmd3R1uDypxcexS3nCzLLo=; b=Sk/Hq+TdD3UjwlQMsfgZQ8PKa6L4PH0yBKT3aIOuiz0ykG15hHmuvFqEoX21e1z57NN7bwC7lB/javorK1sVtFFGMeOkDx7D/jrZkB8oGe09usbXwdiR0ImrkuFODmTbpSqILFzQmVC8mmJdjqQznuIPY3+v4xVTMGXMQ2fF6kaUhpmAwv2k+HeGtgQyXLMV0RZaSPjcOJdReSPrU8oaSbID85PtWzxcEwmsqTN6heAPxqJ9zb3fkrs8q1j43U+X8HjWfy4bWiuP/6wvBO7M7GavjD0h8tUwDgqDjkNik0eMOrWRri6Ohh+KMgOPGTrggffcZfDBnpwjdIgoV5q/ZQ== 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=Ls+U6Awbsximkn/QkNJbncmd3R1uDypxcexS3nCzLLo=; b=ljC0i1Hy/4ewI3gN5e1vPV3z7v643B/I2beBTgWDvjeiLL+kesfIl0Vf9CxO6iszqvyCFFeEoh8bgBwlhmBwzHqcYH73CT9NK5EvYqSVTnIRbYX4R/dXM32rqYmvaU0HJvEBjaUWxgJ31tXG44sHDUj5aXN7nGR39tWSoESbBeUhJELW4kLQmvpk2DeNUn6TOdmRNuWOdOFqzRce9LadUtXCDFW3/qajX7NUk0jxRZtfldhNYdFXNVLZUXOvpKnvIs8T5h1HAEgKaMNqxJzCOHwfAKIigZifOBifcTVdyk3FoUXEUnG2eDez9HA86YSq5UG+s0hxEvcM9PfPL/SIYQ== Received: from DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) by CY5PR12MB6621.namprd12.prod.outlook.com (2603:10b6:930:43::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20; Fri, 1 Nov 2024 15:04:14 +0000 Received: from DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a]) by DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a%7]) with mapi id 15.20.8114.015; Fri, 1 Nov 2024 15:04:14 +0000 From: Zi Yan To: linux-mm@kvack.org, "Kirill A . Shutemov" , "Matthew Wilcox (Oracle)" Cc: Ryan Roberts , Hugh Dickins , David Hildenbrand , Yang Shi , Miaohe Lin , Kefeng Wang , Yu Zhao , John Hubbard , linux-kernel@vger.kernel.org, Zi Yan Subject: [PATCH v2 2/6] mm/huge_memory: move folio split common code to __folio_split() Date: Fri, 1 Nov 2024 11:03:53 -0400 Message-ID: <20241101150357.1752726-3-ziy@nvidia.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241101150357.1752726-1-ziy@nvidia.com> References: <20241101150357.1752726-1-ziy@nvidia.com> X-ClientProxiedBy: BN9PR03CA0107.namprd03.prod.outlook.com (2603:10b6:408:fd::22) To DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB9473:EE_|CY5PR12MB6621:EE_ X-MS-Office365-Filtering-Correlation-Id: cffa0d44-24cb-4c23-5a11-08dcfa8670a4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: tgLLugnwwLJWq5ZOuj+yJsrQskDyptgQNrsb7qZu1kIw6jkOYfKID955bXyNXdUUFDGmxpUe/j0wUi+V8N8WM3iKjH/1TwJ9OQRGUgzDbplovu+MiM62q9TPHUFiGxfWfwngyQlLDAkFm/9hZ3jnfUTguzjujNfaHkCvLFuDe35V2XKBzQqrn1ja3v5Q42EInXoEgnbUXll6vi3xkVUNPs8pRX+9uN+vG5/QFrSQZUzjFQueZ76eg/bhSVsD+kTOXPN9mgXJl06KDNLM9KH/z/Knaxgy6yJxUUGLWpN2ioK7VO1qP7fDXyF6unp2mzbqarJj/nObh4hFpZfHHlN8SAqMiEiH853a6j6Mp4RP/fQsC2oNzKVFv5nTvGamhpmL848fCwHfaUhwGuUCC6eJD0Gi7WnXDZKcDqRSWnmqv3GFLrZwwv8jMNIseddSPV1pAOZKMfjdeAmPxM1ECRb5fLYh2m6HEZbXXLDfdrTcTis/E4uMMFW9B0FXw6ShFWJuDdHb/vWuAQ31+Ny9RHQEs/ai7BfmCnkHhjWUsR+M7S20kmsdVMmiqWmoPOqwl6A3+o7HsQDvEodNTKNz+vjK1Zr09hexyRngoOk0wWgS1MUrvoN8UoWDhPX2iTFv1HaArml3PjhxoIQc8RKGGHOrai43ojeHqsIZNUFluW2u657lD9esDpVVUy0FQJtZdUDwPiWLreiXRlTKoeN/jblQmTvPoncYyHGm5AKKuH0AHtPpub2qJ5arQHLpFqwz9k6XNb9sicaRKtYDDRUU73jaLz6/PBWebJhiW2B59g1kUKD/Ztqssczh/rEKoLzsoZD9n2XrAHnNlAOkUlrXUtKwQ5lRIdxsOA2R9GXaXvXkszpwTUVw6MuxJufj+YQu1p3zJ9lV9wOQBFDsOvo4oSjOpnxs7YtbAb0pE8PiUALpgJNbgygJuKNnfvLi5hvh/iqM59eKKYtCXa60VPy5hnsMO/6sHRFI0grrXWsj7zT1a+0IBPlzY805aeHWmQdH0zUyb1srRjfObtg3ltVA8zUZZlNaHgQolHZ035mCx6Op9XiSuOKMjyvf03sGZ/zCtY4qreEWVBL2QCT+MECNrUXt+nCmwCo34lFy367ndB6XS8L4HF9kaKpLxadQvTualBuYTpbs0B//+B3/074aL0zLt+g16b+uvKNIfPdPKf9CutwB6+HwxZsYEskLKpMTT91H7oKHssqwf7WWK4B1R8zGQdb8DXuxBDIG7cRaLPQNywJOj2+9NIfgTd9urEBp0EpcW7FJkIwPsBvATVkEgXkdsNPdXnXx7/HekPPmru4FoUwGHfj2dp6MZiKx0RK20yJI 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)(7416014)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mVY18KV+DRA891tghXeycdKct+BoHR8C60T+yFDI0rGQtkvH8qlZILGphxaoPvMnUAb4b6IVKs0UE+imN5YkKG9w9yp3aG0zjS8/PtTCNZrri/V4J8+efwRIQoWM6hbW1wi9mqK8dIIALutY8w+ziTwZ97YYoI6tT0XLWXDmf2cMaTCs2Q8KK5CDVkqit3KF15lddt+2KyjvtyuHLLDYCugm4jaJMKT8Td3zbJFMSVZk69/u0rBhgjbNtdtREDe0jvc51fn8M+7FWXgeky9rif/7EZp9aSdyYAbx8Ma+U8Hfc2926etIpxd35FUJG8cz3pgUXsY7Z10biWSBr/6VwHMbp5TuFgS2nSRgELAeNQXCuL23N3CkRoSG5pKW1WCfqJdjCZyvilSENhTvfM/UzHdSevdsJXzS50WrYZLyiMYV9de1cISX9uPBIZLGGQ2/cN9kYKoV/K499ZC8vnpmPT+cHbacY0H5Aj4sPSuc3SQyqdwxm4x1jhFpPFsbjl4IgFS3VG7f8PoHiXLtzOnWv/K7/9RBy+yoRmPJj3vFs2f4kLrzKAaKwqzUXIN/dR7Ux1xzXaEbs5p0yPyUbb7p8eoHsspm2I5O08R30fDz/f20AMkSdusRCD+AMYSMCEwfTDXeTla0kvMPfPCqDGRn7EpA2Tr8NWP9pAiMADL0dXNqg6AK5mhFFvjk+52maR4zwv91d9xef6350B75SELaRb2E1EVl+x2liUDIYdgvKZiUP/gnMYq5d9FwsPnru5cBBh2EpAIaTbcm9HM+Q+Uq2TTYhK2dhrqiP3VJ//r19gb39aoG0Ks/3byIt2WKaqVIwH+j3bU+wsUsXV+6ilL92nmLeLbm4mLXbwB0sG3QRJZHsg4b4+lgoSy2uBz7p2aQaZw9Mu3T1SUPbkZ2J6x//ZroVbB+rvPNyipbHiXX1PYL18sD/70EgieBNWYmVLAiQoQ3GUqv8MpNheyhi14mDrDx93Spd5qLIlQtacKQ3iBTXJxlSw/tHivN8NarjN7VFXUPmokNnZLVlQpLa7GTHJ3W6QMprXnE4PoKPkcSaQnbASYCbUHiO4fq4/EJ12vBmSydvyi32SQ9LK1tfPWf/gxZp3j0tKABYg6ThRuom0tQRoUNv7MJJvJiF6ebpfSUzbt8l65fF/EU8ZdmKoVyQDkGH531fYQUbK6ZkWTwdXG+7pEHBYVoEzxYtwIQQ60fMCM2ljb9FA6TzGlmai7wPZ+aZE0vQrbeb1L8LmvnWoWTcMeeQdITsNjMY0pj4n8BATShzTuvgttcZ9iZoUS2M9rAHnY14333HOuFl27ZsbD8p7Wiqxd9HBy6dW4WMjnjst3ej8FFDWY4Id9hJu65dpLsD6oiZqqwrdVYzgTUpJQAabpialqADbDbEtvj/zQhiJht7OQtw0l0LqifYDI4Noq+TAV75WSX+R2g9S7YXuhkAFF+ZDwzUlNHlmCHwnWJooXCw6UsQ7M0Eovr7O/gRtdZ+iHAI3gcx8UPnoncY9pugYfANAUAUMGySdWNUUmDXCDrQiDgoPnDu3l9bc5nc/vIwIwCGbozd3Vf/d8AiFLXCWY+YNxmQDpGu6uG786U X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cffa0d44-24cb-4c23-5a11-08dcfa8670a4 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Nov 2024 15:04:10.3552 (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: D96vuK6PyP89Br657QAtqqCpL5tDdEtTOGLmkS0IRjWi3L0E1gs8Kppa4MBA4Vs9 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6621 X-Rspam-User: X-Rspamd-Queue-Id: 082B140029 X-Rspamd-Server: rspam01 X-Stat-Signature: 35hyg6fp457pp4rs44dwjzaxxq85k4ww X-HE-Tag: 1730473421-120692 X-HE-Meta: U2FsdGVkX19Qk25BhH6kasaA/A2rU7nouJHCyM4oJoxxQsFK1yOjnn7BnPE5JRht9i+sY66EBaWWibuT4fDzjB/94zC/OMVbaxyU92NqCEb/hpSQkGtSxWFOrCfuIx8025mfdbLbOD8xZZRnLF5ObBweIZwsltkCajBBgRhzgG4b9N6pwGYu4UYsvIJbZvU1zEwvgKKQNaIbq7n9oDAUleilxxZaLa6CjKLQ0t5hOxg7bOEhGTlBgn1rmGSQaw/fqdB58aL0zgCbaEGsePgJ0vnz8xgyT9IPC339/N2Jb5LJSE0REZpuqEcTC1IzG5yk65ZSrJDjkkrzOmccDk8uqgBH1B7YUutLSLhBxCrAAceaewg1hv9m2TPXpXJwt/Ui3ChA4RSk0xXZF28Gz8Q8gWW4C1ypNveNPa5Tc/ekc4IPDUPo5bJo3Z4nh0RsGVqlwOt/YT43xgIEpKtvUU25vwiMaXhiBqSOEpIxHxte2HUOLch3rCYkT0F0YrxdacjHk7vbOSo1RU+MKttxxysqQl2SM+3dukLR6TF//+9ywTgggF6+UQpucGcPnUMqOQm4M6A/lrmq+/uXVg3PKpr1o5wRnuRK1y/8jt9w20Fs6+Zuf5Xtg4r83ot6MZoPtV39ntut5CFXWn1c+SKOJk/zQWe9QfnK2BvTT9hSu9VTl/da2zR8/XvW9qJESfjgUScuC6qcDhxtZLGz/9jngvV4dgZCbQkykW56v8LOhwztKOecwjUPzzDOYF+uTCzysaqOve0OKdFVHR1nyMTDIW2J/pLFrdqhpoDaELIPZI9AsVd+PKjWSiZGQhW+sIPo5ahaxGsnj7sqVbNhq0dCUO9RdlF6V92D2swVHGjnHsqDnsDvVGOk511dawK3OrZT8NaCc6cFO3KhT4QDWy679Z4OryZ3ehuKOKB/Psz0r+bgh8PPxLapcqaESqhHQsa1rqF2g43A1gDpBeqH3HN8bvE 2Si1/1Kr a+yO/rGltQOCvMuFKvA204gy/jemfTDbPnbWR4j1wJ9sNF+yBZue3xDpaVLztn45SBintBE0F7tnF2+cWtM907tALJF6sgufF5aLNQluT4rd7LNVGKztPH+IVgnDwYkKybKZ0wOR+XfcSxkVUXLh+Hzf2Mk7yEQ8H/lAS+RtOvnKtvpXUgXRk0T0VFSh+hsZvUWPI2EqJKwohg7SzGeRqb+utNMZBcGVYVIS3vENmHmOizqm+PC+3GxNxZqMunU4BXa+0cPqPCIg6xDUHcU7OtoKbU2S3F7U0d/nOUAxDPRA8CyNzronIFtqmt0j++1QNrHZ7MCgpWrmun8BB3fd1dEMkgA== 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 f7649043ddb7..63ca870ca3fb 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3705,57 +3705,9 @@ static int __folio_split_without_mapping(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); @@ -3971,6 +3923,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))