From patchwork Tue Feb 18 23:50:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zi Yan X-Patchwork-Id: 13981087 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 D2B1BC021AD for ; Tue, 18 Feb 2025 23:50:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6AC1C28010B; Tue, 18 Feb 2025 18:50:38 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 666FD2800FF; Tue, 18 Feb 2025 18:50:38 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 43B1228010B; Tue, 18 Feb 2025 18:50:38 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 201522800FF for ; Tue, 18 Feb 2025 18:50:38 -0500 (EST) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id BD9F3140327 for ; Tue, 18 Feb 2025 23:50:37 +0000 (UTC) X-FDA: 83134712514.20.C9961C6 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2047.outbound.protection.outlook.com [40.107.237.47]) by imf16.hostedemail.com (Postfix) with ESMTP id D7DC418000B for ; Tue, 18 Feb 2025 23:50:34 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=BC4pwUcj; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf16.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.47 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1739922635; a=rsa-sha256; cv=pass; b=RW2qcM1PAID7a3Z4QpfHz0zfEt2mamrMt4zR1Wj2KoeGZlg9wTtVx9S2k49UNqeqN+q6/V mYEbTNs16rZu5DI/ip10suMbe353XAhzrBV03OP2mF5TC4IwWlDBRFpIfOX4KPHLavNG6O qovfeNixqRkISZT9kpFlHda+pIE77h0= ARC-Authentication-Results: i=2; imf16.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=BC4pwUcj; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf16.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.47 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=1739922635; 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=qjJYG5I9oY97IgtR6hgx74fjlKX8/ku946e9EFhfCAQ=; b=3tQm1KM8L51VMlnmZWNaPjFoa4/Duu/oj4TzyBAexShkI0dcseKcw8VBijW+2C68ffB7Cw QDBQozag9sHV40laSIcRiKwsfahLKxFI686T5+akNf4j4PLAXH8URY1ogw91He3f/K2yP7 1sR8iJYyr/AwDZONiDvbmUvAPr2Pb+w= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XnJ/jB9QoK/Z5XQm+6+ytH/COghtAMJzO5HAvnvMdRGMYoKKRDiuE0mNd4Fj8elNjp61GNzj6LSNoNPS1D19B1TIEjJ+4eSCfTu5r0sCdUBt+U5ZbbCBO+ggahuVUnSrZvFMZCRUt5Oq4dOIAhFnKR+AmULpZVZIocor+WwjLcND8fz4DbRF+xZfBgwUrbp6cNvasM1IarpfyIdLfuJM6fiUNaiANj34WK4sWEYkwf7NmAEdO+hTHGQWFkE6/ah7J6kqgAkFoM+QwxuZn9U/lvlF53a4Z+DmE5rJrIxEUrMfWs+M4NqNzCTjFl8vS/WMYxvZJSSn62e6aGlVbI5DAQ== 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=qjJYG5I9oY97IgtR6hgx74fjlKX8/ku946e9EFhfCAQ=; b=CXk68jYu5o/gSjlZ32nWk5PykX8NHRAudl/CB4H93jgC2pBGgRHRYLC//yMr7JhjApi+FZyV7jatMkuEI0pCLLX4unxy4XmOF+LYpyaLa5PUonj6AXllFtG+9hSxC+Os6Ks3pohRn6Z6OBE1u79MDYx2jqvsd317THs7vo4vlDemhOtp5wcS3eOgadX5Z15d2Q6NPmXBo6HDQGSyIi5BtL1Cr2Z7TZPZqgtUTYgCjSubx3KK7EFVMJ3r4MnVrrfXyRyqzS0RDHIDkDEcA00GgKg73zBu5rHONSpcpp9uYqTKzykPHiR3JX88hOFMilqWvF6ZIsNo4vEVTzVHzu6+uw== 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=qjJYG5I9oY97IgtR6hgx74fjlKX8/ku946e9EFhfCAQ=; b=BC4pwUcjg4U+SR89Rsz5HTktHxDkt/BLZPvR5dOwtNZDr43OjWvyeMQ5OxqRpDefhfogScp91vD6edM4lf2SIluDERB18G05xVMwbfU4g7tKsyC4um5BpPc1e0YLYgnvOIIJnO3U7OaOj0HRCLVG1Zj6NPNXc1IS3kT/+jUP71IN3/x/dxGK5EQ0p3jqWKgBV0JuOEVlidHxUhyG3QKkPxWDvZjslDJgjvztKBB8bNS6+mwzMTE8Ui1IUEHJqJ0Tm3sIswN1shgNVRrb6fh57UQC/K1L7nLx9t/EXGxeN2u8byJ58LhqXtyYLlaGMOAC2bwwYng82DnvEQZO/TsVMA== Received: from DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) by CH2PR12MB4326.namprd12.prod.outlook.com (2603:10b6:610:af::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.14; Tue, 18 Feb 2025 23:50:21 +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.8445.017; Tue, 18 Feb 2025 23:50:21 +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 v8 3/8] mm/huge_memory: move folio split common code to __folio_split() Date: Tue, 18 Feb 2025 18:50:07 -0500 Message-ID: <20250218235012.1542225-4-ziy@nvidia.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250218235012.1542225-1-ziy@nvidia.com> References: <20250218235012.1542225-1-ziy@nvidia.com> X-ClientProxiedBy: BLAPR03CA0069.namprd03.prod.outlook.com (2603:10b6:208:329::14) To DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB9473:EE_|CH2PR12MB4326:EE_ X-MS-Office365-Filtering-Correlation-Id: c45fe844-6d8f-41c3-a9d0-08dd5077016a 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: ol85hoJoYZFD8U4PJv1qMrxxXqCSPon1/adRoPI/a95yior1EVi/HKHW+snjz+TC7uE98CbikzEAeSW4OqDu37uZX9JRfUYVNSaLERuHL//J/KusOqTyUscQUvY9foHdrTiH9QveOBTEmpnfOJLlo5koMMPa+W0qjyp9Nxfu8TtIAdGJo1LS5m+uLpg516waMfaCw/T/SHToU9kF3u6kvVUroanxvJWJ82Tc/RQqjNurjEBtnRAsu5VyeIsYPO0uSHiwIvEf9nfPqFN/8I4kJ2iF1FCEwoZYkYCM/oCZAbrQs8ez0jxgl4iJqTcY9rWdJZSUMoMPV7jIgwOD/ObzhqDhXFD1jMeEv2taKHLTMLXea68S8PpDwxoOaR7SMvzdS8w8BDzJ/yi1M5L/X6pI2SezwukubrU7MohRtqkvmza/GoUquDGJMKN/8KHC+61gv0chIWoyN5vFnhIoDvoMsY7ignWdGTTxfoVqmfNTOF8i6jsZafDWyBdxtmsTo6M2Utx84wch6KgbVTmnuo74tDr1Uh3DQGo19NqOgfaOjc7TwS4tei3a2guq0c/dnO9pnhTt7y13IEZwdp7v9qeOyLIm0fPoLM1Z/tgRrKj45G0b9Su2d8Nns7KPjIJRurPhdeI9sBZkhjoSzKLk42CDKgFxCKWgB3c/0wgIwujoyGOxB7Y6YKdEgsr8nsphqVt1RSKA/L6xCiWyCIjEd9P/joOOBe1oGyNC2JFpcohb1+LZQ00mZRs6/+r6X+hqeyEEDd/5YsHen6kSt1eD43r5xCG5drDJQNPkdL6nN5jDcM5xTfkxmv64aOL+guwDX703JxD6I2+fE6hc0+J+CP86BVS6eYCToL/qpVqkwu9liwmF35Zg0Q4fXmXMyu1jS+6w7f3+I5o8fOD5+eeFKqI4wCKz1x7lLZmse7ErVbrsSmxVfnvP720qI+2wcXHIyiEvkWvMLnXeDwmsivFcBY6/4xdX8qo/Nc/cULQ5X+S7JeamDsWqA2ahzbC3T+dbfOxoL8sXNY3VNUJ2PmCeheicNyOJDm4eEhiklWaoIuT96sS9kmiK9eSF8iuLqXL9RVF9G/DAw1dAkdqq1pZJAyh1wmlq2JNkjHrMbpYooN3eTDRAMpGxqlbw1tENrMOSj0EOhe/p4XGn6nEzQoH0V7Z68u6BFYQodivkMPkd7O1S0cnkv6u4TX1rRbULDUyP+9ZP4H7VHHP1RxHPB6R9x8SSy9lxFi5UYSqTQW4ioebuCH2NwqXWbGnCl1plSgnCW95W74W+r6QlZ1mqdjiu/bSoisJ/ESRF2kUSynocFdKpi/yoR+5HeblRYU/VKcXC9Tc1iwDS84Zkn8l9OCrGwl8CSaqNuPi6y2VFjt2FonhFK5UZX+VCwzO6W5jas3YHeoIe 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: 9d5iyc+1zTRhGh+Cy5PRNaEwETiaoZQosgTV3HCzjA9m2XER7Y/NTbEhBC5tGhYVFEw+f34kQ2VGBjgc4NKS6dHH8/BA7H1qz0MYVjNwRrfR7mk5cixwrdDzJSvZbYJYJCRHZSZm8aKx8Co8QahZEHDyEPURBUQgcQB53lQ9UWd6x5kAVDYYERiF/Aca/CNxNQLzr+NF+RGBDIqlbSfzmiHPnsBPWUD2a8JvIQGPV40ox713o/ToBIa7Xldg+LuobczvoeK5FBqCFmm6mCKRk+A+YKevv0YKTKbwE0+tHjUIQy+X61CFJYVLLG0W57uPBbA2Ku1zQOJuwO9gEogNjCzs+iVpCOvXP0pyjz5J1rjq8UX/EF5mBZfW9oY8Gw1vMDHwAei5cpiLF4ICdZKSEyOVvoFgHbDBhz6YCQoWcBfrMULj1KUkHSbdU3gRYEJBnmoOdqEwwO00bkKzcWK44gdtVvXXM5PfW04tY6ugiQ6eFOHfdWMQO1sKpB7CUdzvWWy8QPc5aSF5p0mf9x7Qc6CItLfN0Rp8/+t+fmm/uMyiJ9c5CpVJQ4P0LkBvJ1fQBF0xowuLoau7d1DVxZDS3hE2mH3Wm8apF3zN6N3Jg76vDg2NMEyOkev2jmbKD0bvDmlKbyBjkXpsMdlz03vI/OxsNjxH4JP2TqpnXmPr763u4JxDqBYCiPXQXG2RKcg/13m5DETyy3B0xNy5y6ig1guzlzcgTvuaCvySAkirALF3Y8M2z7ryy+dojIk0rUdCTepQOadcSJq03KLYLF4Nqk5vyYfi02d1kQvJFYojChlPBvyEXVqdSopsOOvpEZxt5yKtPh61m5kCUG5CgItS3ESEUOwULqRRVOEwF7S/d29eVsNF1yvjwY2ENqds6l/2EoiKxEzCVRNt2SWzwobMTSAda8oF92JzWkxM1ksYbts09cJuqpqO2GaY0blRgMF3Oi+YIV80NjzHl7QxuF5EdZNA7TUEfhnM9BCLpQ3k9cCWm4COxnoo5I1d1bHU+v6o3UnAiPEjcIR/wxHvjL9RagX3a56NoZCQb6Yoy/jjoSPCJm9AyJis4P38M3Ik6pp7IkXp66TknNQV5qSILsJjRmFAF+bLf2In3nw8pOiPlLQ7LWvLkj6NYFcLG/nSjN+A2pVHVpJzgd0CwY7+xCoKHmG+1SJZqNewkh3fr0XYK2BakKBqSmhPOSin8os9iUG/rz+I+3/T/JS733d/L47FBVljEZYHEi32wG3HZ+NcozybpUdezGSlmVyDxUYVQu7ciHcoKb4N4lCcDjVhnyzwfhftjkvngI6+euYqZHCoNLEIvNYc24tjEgzz9H7Ev8BV+POnbT4JCojYFte0pkgl/B4Drpn6x91J58tZUS6zKqNkE39rziAJ3jjm2fWm5ADta/yaJ4nWfDWZVq3wXVBmg8a6PahkTpVYlqgej86KrUYvx3yb+1v+F8IwUl7kuFYONMTrNhM3Gx1bEvyHf4v6f2McbZsTcEIah2I8eCY0Zq5ix/liHjR/jCeUv6CSREVW1MV8PfJKNwjmGR3BvP+AG9eimwCOhDoZ21NaBSkPEQHl4tlwFHNwHt0XOIC90cQd X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c45fe844-6d8f-41c3-a9d0-08dd5077016a X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2025 23:50:21.2726 (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: EFVXM6/CAUhsBczZq9bdKZbddyYPtgYwjztvSqyIEjvld00ac0kfFSj3MtyVBt28 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB4326 X-Rspam-User: X-Rspamd-Queue-Id: D7DC418000B X-Rspamd-Server: rspam12 X-Stat-Signature: urjeqzohk6qos7s9bhahgx8snppwx4it X-HE-Tag: 1739922634-979771 X-HE-Meta: U2FsdGVkX18/tQcUzKi+/ArR5B8ZNNILcqeH4ZlLxQk+atxZqM167eMOCxI1HFyvR/gkFpdMc8tZSqcW5K2isJOy7uVi9VqPL0MjJqk9YbyfyGLv0EXfcZzUT9w5tZYpiikWmiG1uwF0FZiX3OK6OMyMvACxzYLUdO0DZZubSnc5KR1UaINug+5/Z4Hvg6aPJ6Zq03lVplBCmiGN3RX86cPrMRKa8lQqnoCAzQjfmDHa7qmaBCOaTVWHY1TBuNMRqxCxD0ve8X6YRCa9T1mgo5zBzWxldcZsSmV1ZC3lm4zwDVWUIw0lj/S2Fy3gb3OGLv/sVk0Ip8YopP14KY6wEtWHVU32ZnXwHQkTfYDXrTtTgQ3gUlkYIXtFmote6/qa6KoFcMC9p8c39oJowmgl4pUSNeypqQolDWtkcfK/68+1i1T6WGP/fqMqJAfD8UnmDGlkHCGI/6sG8Ixxz5wAdHmx4PRG2YZZ3kYkQE93oDKNoZ1zqWWt71hBjmoPCzVYIX1lRkuis2+Q3nsmuPDnvZtnHJ7zAX68T7N02vUMP4bUHZo9oSBy0+UUoL2etQSjDEnLIACGDhQCLl3vLRhvOczrEzA+ussd92Arul2RI2PCzzm2YfZypPebMClYEi1M3Mz4bjicFxhDOEewPQxy4I2iBl6OJZje1MJC8v/sTqC99orWCXca81kLabdHq+MfvOQRxTLpJ1ZA/aYiLOHrLVeRN9ZeWQJxUdrYPWmZYd33MDQiJigJARxJbK4glL31dWHdP1fNDatQyedUKisPnViKmFtAMec+YvWggqldYkhteng7XJdt3yZeNkZmF/0Y7Wa0W3Q/u3fu78BUvvz8u/DtAq8LABug1viFtWarzrFedJWFfR9geuoMbhW8hqqZsXUcw4u5Vj3+RpGmBrQaMEwSFQyzPBFIETLGqtLrUaeMa5oDR9qd2mEUZxwWgw+3VsgcfK1mwLYw0TYRtSq LSoJqwW0 wSmg/bEL12ATMzkbEnBbTKLrJVPuahtRoRkfT01sPqhqTKIAeDfE1GT1zfSWXwRoe9shx1Dk7+yNgvcZmpfyNj48ZJ2g0hEMOz/1BXNsPCLLJSjHcwUZ9MQdwoHT5LlbdcgFjJSzP3WZ7+85+Dd6gOVtNLBuXA2TETYbKWjZU9twN9OQXtN+g2ROrgaFZoT/y0vKYJ6+di7CqZ939ELjMLFAEHQ3zAVnNSzWV7K5NALosiKqV6DaPH+1FtqM7sornPM3yyjWh+1epP7i8qCbNPRQNCpfUZ2dNXdFmiqSGcVUEFHlDSJ0z10hDxIBggsFe5k0C1jVf0Vcci4VcvHKpGX9sMNcA83nW9XcHMldB/rZ2VuAQSQ+A6wnkJXXY/5m4TGHV04kH6lU1juvkxBlzB4h9rYnDdRFMQZ/Gm19PKjTytwD0E//hQuuoiBSOZvF1CEe65Vyv6u/2f2DkESMC15bm40bkITzrtqTIKECEzbvS96vz+bNHqLcdQ6xi5HDkU5FwZPpH1EL5OcLDHosaj5NRvs5yiPJkZr/7ZHjbm2NaBNrW1/0u9WQbmjSRdJhFpIOQcZPoVmER9v5kKxnj62iRnrDcVezmOSGMdWNac2+5fMdzKvgm6+Lpir9EEMzSv/1R6wRHiZGbmi6r2VI0j5urHDyIZIgoNA45qpqsO3ig7mk= 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 Cc: Baolin Wang Cc: David Hildenbrand Cc: Hugh Dickins Cc: John Hubbard Cc: Kefeng Wang Cc: Kirill A. Shuemov Cc: Matthew Wilcox Cc: Miaohe Lin Cc: Ryan Roberts Cc: Yang Shi Cc: Yu Zhao --- 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 385e424252d4..94ed85aadecd 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3730,57 +3730,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); @@ -3990,6 +3942,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))