From nobody Tue Dec 2 01:26:47 2025 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010004.outbound.protection.outlook.com [52.101.201.4]) (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 B90E8288515 for ; Sat, 22 Nov 2025 02:55:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763780146; cv=fail; b=k2GmrUfE+rdZ1oU1EnZVQq5rAzThqGGDUMXO254y3iAZLk3d6sE0yxZRtwlj3ENTKDVEIn/y3yhLuzwp9te43Xk6AtFK8JQ5eVa1NK5jJpJIzUKncLie58m+5okR7r+sUypDtrmnpj4SEcgEUquYQ9ICdh9u6L1EYPwbjjgwq74= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763780146; c=relaxed/simple; bh=nvsj/VVUI1D/BO70liPCxtGah8qfX36r5Ho4TfEySbA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=D7gxoIJZKVPNLaq0X2LAYOof3rsFLe8wDbQMYVjzff3jhC6nnNIFmYinWwIyHf5UcOjMNIrygpsCwdh5joG0xAixkGksgzKSUp1fkYCTFViAX3QQ1TSh/jpqZogwIAsxF+uJ+mOb/APCdBPCKjanOQMhMkHyq3Kiubmvbuz5XCc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=U/svPHUf; arc=fail smtp.client-ip=52.101.201.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="U/svPHUf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oyc/h/yoCtPRtIiY/yOrR8T+YzDVS1n/heRE8l+LyvClMu/eDiC6X11t+TXVZvmiTorj3wbzrggmp1ZvrVggpio1qu6zVSGLJwwalHF+ZUjpWNmlm5nyJYnC8upbW/kLASoQ4OaXSRQ/bFu/DhYVUdjSq2Kq1s7JpvdxJSxi1xWHkjB/dMQYQzL1bf3190cseT2r/jAKElIKKzPX+DgSHesoDMsirmeS9R3vaRtj1B/J/ujZubbBvvQoV1Q/TUGhv635Twf0ct+abPR/z736tHAJErIgh3no5BHBlPU5Fr/9VcDj7wrE29bOOYRN+pLtqwziu4m79t2L36IUQxh7qw== 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=Dp8wqnebcphN+TiPVc8lxUz8G/aCi5eZMNGk0TQrpMw=; b=wNfq+dBS5SeS98UYvdqJWKKqH8LxyJ25kLy8LOoDscV8p3kXiY76/7ceoRv22XWU1tWBrcGxbI0Xorfhxe0dAFELfnz3nQ0TD+MWlY/djxCXFP0KPRIUrHysfId+07BuJNofbJpC/vBxt+/7eC87cFs1uf5HmGl2h93Pkc5fyZ4YGJrEE+fVGw0bICb34FfU8dew/g4QE5FwNFnV6YpmBTwlCMAEwB5RlFex+Ycd/Sp8jIoP6LIbBpcTfos4eRoFpOvFC31XharEfeQD9gzkOgJrcCjGLS69RXpSHgqPlKTKDD/QYh0RmPk2bewzSUppI/IAybh09fAWRlk/KOLF7Q== 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=Dp8wqnebcphN+TiPVc8lxUz8G/aCi5eZMNGk0TQrpMw=; b=U/svPHUfmzuFdAZ8tRZT93U4rxxqr3XQIXR4I7oumYaCgjwa0VrNfrEC8mf82E2RMBeP/+z4QFOiWI8jTPv+Ggh1vfCRs/MxvAuW5ZtiNY1DzL5AL3/2CDc/XWrgnhtzh0pMWkrvXk1uuSfCVLhy1vhllfVcrpHr/K6c6MeSGuN3QVjcbFc/WG/+s+XifERnOUJmmC8DhK/UYsNWq4C1e+7ZSLrbqrA2udga0b3BDWeok2BQ8o2zlSYV+dlfpm0XzXwy2idyLeajHH0Z89udEofVjKmaVRxjBUJJkqxYbV8tGtFxGktaVXDYGNKshXCIL9UfK73Rhs8EJKD88tSuzw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) by SA1PR12MB6994.namprd12.prod.outlook.com (2603:10b6:806:24d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.12; Sat, 22 Nov 2025 02:55:41 +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.9343.011; Sat, 22 Nov 2025 02:55:41 +0000 From: Zi Yan To: David Hildenbrand , Lorenzo Stoakes Cc: Andrew Morton , Zi Yan , Baolin Wang , "Liam R. Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lance Yang , Miaohe Lin , Naoya Horiguchi , Wei Yang , Balbir Singh , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/4] mm/huge_memory: change folio_split_supported() to folio_check_splittable() Date: Fri, 21 Nov 2025 21:55:26 -0500 Message-ID: <20251122025529.1562592-2-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251122025529.1562592-1-ziy@nvidia.com> References: <20251122025529.1562592-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR05CA0060.namprd05.prod.outlook.com (2603:10b6:208:236::29) To DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB9473:EE_|SA1PR12MB6994:EE_ X-MS-Office365-Filtering-Correlation-Id: 3f980bf2-b27d-471e-4525-08de29729fc0 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: =?us-ascii?Q?ngBU5zA8SzKSOO99XuqCjEfOhYHxzotO/qQ2qh6/IM0bKf15ZixhE03nkHUL?= =?us-ascii?Q?oL9Bf6wGPcHoN2t2tMlA+9y8ATPTvDRFvOyRsSNDvl0uiu7DSoiBylXpmF5h?= =?us-ascii?Q?E3pHrZ1yGfibPTjNsFV+Qd9o00zqt/OUpJoWenjHfZtfz6HBpyhd7CGYLF66?= =?us-ascii?Q?vu0IWy9ksExnkhBGbOHEykoxTkj/kKdO+PfqUjTaurszbKI6+eu83SPwGN3l?= =?us-ascii?Q?HKnu3o5upvTFowdrEj9sW30AzV4l/uGzkgkJe6KIp4cUDK19jSwxCnUToFQl?= =?us-ascii?Q?JCH7V8e4QOf2Nee4v21QoQtmqSQ5B6MK/YZ0S8O2H53y5YEJKW38kA6RQQGw?= =?us-ascii?Q?SjENycOnGF9nZFXvzSAfaTg8x0pUVaVFY7QhOOPNAGtpHDkScEgYb06vV91w?= =?us-ascii?Q?0o6ksH8eN6wGXpwAaMkJmbvIVaanbood7WNkjnsJFCi4Rj0IGdiT2+g5mAJ/?= =?us-ascii?Q?BWCPsbhMlekIQ8GijZ798YI3S+0Mgcf/gBhhw5ybSU0Wkob2k5jj1ZBMW7+j?= =?us-ascii?Q?3zsBCsYPJWL3Hvmd6+qKuIAKy5KqDUTzHMf07APdVun2ntd1Fd17Onx3bSzB?= =?us-ascii?Q?4Qm+36F4lpWZQuDJgV2W0nbliRz4ap/H+qXXmogfyqQgE+K71gDRYSb7ANSb?= =?us-ascii?Q?9xOFHYvFS28jVNf26YVCxrTY78vD/B2qEZRAnNlbm0Bh8ejlji8vzQv6giq1?= =?us-ascii?Q?D1217Jgex1ATPFIDJM2ckJ7Xk/1a0Ca98ZZsOghPIcyiavtivD3JP9DT2Zo0?= =?us-ascii?Q?L4d6qT2gg3dRXM+H8n/PBBghqEm2GJrNgMKvi31vk52r197UeW5o2maq0dJQ?= =?us-ascii?Q?HID23Wj1QZ+PUBrXRCRco5pAErjT8V7uFniI6NC57l0+o0vGvlbRjUhnl2oU?= =?us-ascii?Q?+xO0E8bp6iJlXDRCRKSTpc8f73akmYFjKf2qB/jxZkcXPqoOD3e9WPt/PLJJ?= =?us-ascii?Q?9yLfNbW1eA6dRAW76oOFLEZ3CQCGkmMVfmVdElZMJjEf1fvylxbKqDOUHYd7?= =?us-ascii?Q?eCgiIXj3/1qjqBdAKcrhWwHx+yas7uJf+1l3qOFMuB5RLM9MmxVEeMUYG0ku?= =?us-ascii?Q?YK/7H0yO9lig0obGU4gmxd5apk2Hb6GhrPsskmL6GYp37dsd5G7alVQyL6Jq?= =?us-ascii?Q?B857o15MR1qc3RwY+fHX/zUgo4nI4ISrUc1ZHxcZOv4nN54fyvXveYFyTSFs?= =?us-ascii?Q?uqkFN/WHw9JwnNAxveGiYfdahhAmXYtQY3ixg1oLkGmhw8cusaQygIOub8HA?= =?us-ascii?Q?i+g13wMCRnmuPznGBC/My5x4aYieEJ7B0ngdyF74QeeNZG2ADOnNWuYjfoPN?= =?us-ascii?Q?Z6MCYUlNaiCvPFiKuP2FBx6mCqNlBmqEMnf9DWIF0BJ7zQdJtWz5vrx5Cafe?= =?us-ascii?Q?VRAOr/n8AaCsSZDO9QE5SkH7DhvKfDsNx0BsBki2gE4RekX1tMuKVtcrz1wu?= =?us-ascii?Q?6+7ewiObjMSdK+28sJ41S5XFa414jBIo?= 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: =?us-ascii?Q?SoDeudQSN3RPdJ+ERMAu+qVGUBDp4H0j3MqgVYFxeL3mPy4Tu4oxu5rpwAHl?= =?us-ascii?Q?QnBFZM80DqAWAUra/tzQobu912n9KiQETuQ7EUIkTIiQUK6/AxgnoGUMJKdY?= =?us-ascii?Q?JMlgi089iQVJbnwgHuwza0EtNYiCGSFatjR2brgaVlTKrr+q6ZTRjAge0rZA?= =?us-ascii?Q?sOfVn5BF5lYsFwBt97iIEp7CC5s4//70uZAxc8z6ehTy5s60mypZJg1LXJXh?= =?us-ascii?Q?reVXF4XxFlZq1luVQU5pAe8ZTvv1ljDEfteGLsYSXR5MiWIE7Ggn7eRX1MFf?= =?us-ascii?Q?PFcMglD6u0umLTeGTUht4gEj6NBYSspvu8XHyKe93CcLl232AlpwTZRCVcyv?= =?us-ascii?Q?QkO1OUBa3dmHFVnHQWnmzrhO2bwcWYZzsvqZmrAwsivtiy3XMTyxVTlfBhun?= =?us-ascii?Q?6XXuyVduS4pi8RFCXuOBj6FKRBa1yvTZHjwpLxIuiYo/UubGfcSg44wDTRNK?= =?us-ascii?Q?f8We8idyaBhWfm4V1hpwrXB/4ixNW2XhlmQPrC5fLTxEmqeQy5bEY4exATmR?= =?us-ascii?Q?7Hia7fy/b/q4WhI+Q0vtCOg4os8opivPvUuExwqDOeB02gDt/hO1vyiIXFOC?= =?us-ascii?Q?CMM5+cKKp6uqJN/ymL8eILS/aUBz9e3GisblH3Maa6ur5YaAnu6erarnfpiq?= =?us-ascii?Q?q/48FJe5hODTCkXnE3nAJlDjUz98pknLCSCeuCdLVwfZB9jDKD3QRas+hy1Z?= =?us-ascii?Q?w/UCGVITPbv4RwsKRoQZs7euzaeA1pGHXOkJQ64Ff1oVV3YbJY/BPOU6hAWW?= =?us-ascii?Q?LTFUeEvj6h72MxwkZhYfTiYksK1fPGLVwuG1LwmLvnWrzb3OjY8OC0ng83jb?= =?us-ascii?Q?/OF0/zuSvcMC6Uwwo6+WmMrZPvjqiiydSvXGR45EbZngvsaC++Yol38q+zaa?= =?us-ascii?Q?wamraIa+lwCGDGLRKFAeUeA4GwrEnNL1V+An50KOlxxpn7XUbm7T58tYQ8yt?= =?us-ascii?Q?mUEqQJvtpE8wavne9JhwtS6QH/vgWz0yNJDLGlIq1USCBEcRoK57tCATqjOF?= =?us-ascii?Q?XwGmZt1fH3kxsGJ0XVoaBRcffq8qVopQhiWpI0a+efyqPqpPAlt7LHUKfWgS?= =?us-ascii?Q?BImDPVjGxw57kw30ucBjehJnEfIch97+ED0o0Z3u0z5jkO4VWxhW3Q6bEksK?= =?us-ascii?Q?HfcMTZvoMA5Ko+IvmGWfmpud6P3b5hHDRDzIPGSmaW0LuAYxpUAn0M7vgJPf?= =?us-ascii?Q?yMRVJoJWi2FKQNTFT1xqPunSodW3pI2/ZfVYrPtaRcToFUM0GpSo/mdj/GQb?= =?us-ascii?Q?lQmHy3BNSojnyWVl3sLhrUCMGS6xp5Phnw+NU/Cqkd7VSbl5UWHFPBm+fRMF?= =?us-ascii?Q?QP8WHfnMawgzBkUZjASA9qRAc6ug3pdVmL9rizTFztwXxErSc6QoOfk/dtbI?= =?us-ascii?Q?GqzcTOtN3UaRrgbm1uSUtj3gaCss3GlkF/mbeO8eHnwz/YeuUv3OVCIPhq5C?= =?us-ascii?Q?+w/ZsDMAKtT+QypiU3YD7EqwFkwKeAecy+Z/wezHKs3H5aqfoBctfGKlewSC?= =?us-ascii?Q?itD5J1qaOtEXSiJPBnV7At52anYL8jGhB7CHpUb6t6q9Xq6edMqojgiH9yxc?= =?us-ascii?Q?EV97xwdUmP8agVoBV1bBoZ6QN+PVEcYvxtdWK5jm?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3f980bf2-b27d-471e-4525-08de29729fc0 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2025 02:55:41.7295 (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: eHVFXMWy/Y45cuXK7NsPrrLcsYKWpnEgrUAbzS/fDoLRtvJT8uoQ5Lb7B5K2Orkk X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB6994 Content-Type: text/plain; charset="utf-8" folio_split_supported() used in try_folio_split_to_order() requires folio->mapping to be non NULL, but current try_folio_split_to_order() does not check it. There is no issue in the current code, since try_folio_split_to_order() is only used in truncate_inode_partial_folio(), where folio->mapping is not NULL. To prevent future misuse, move folio->mapping NULL check (i.e., folio is truncated) into folio_split_supported(). Since folio->mapping NULL check returns -EBUSY and folio_split_supported() =3D=3D false means -EINVAL, chan= ge folio_split_supported() return type from bool to int and return error numbers accordingly. Rename folio_split_supported() to folio_check_splittable() to match the return type change. While at it, move is_huge_zero_folio() check and folio_test_writeback() check into folio_check_splittable() and add kernel-doc. Signed-off-by: Zi Yan Reviewed-by: Wei Yang --- include/linux/huge_mm.h | 10 ++++-- mm/huge_memory.c | 74 +++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 1d439de1ca2c..97686fb46e30 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -375,8 +375,8 @@ int __split_huge_page_to_list_to_order(struct page *pag= e, struct list_head *list int folio_split_unmapped(struct folio *folio, unsigned int new_order); int min_order_for_split(struct folio *folio); int split_folio_to_list(struct folio *folio, struct list_head *list); -bool folio_split_supported(struct folio *folio, unsigned int new_order, - enum split_type split_type, bool warns); +int folio_check_splittable(struct folio *folio, unsigned int new_order, + enum split_type split_type, bool warns); int folio_split(struct folio *folio, unsigned int new_order, struct page *= page, struct list_head *list); =20 @@ -407,7 +407,11 @@ static inline int split_huge_page_to_order(struct page= *page, unsigned int new_o static inline int try_folio_split_to_order(struct folio *folio, struct page *page, unsigned int new_order) { - if (!folio_split_supported(folio, new_order, SPLIT_TYPE_NON_UNIFORM, /* w= arns=3D */ false)) + int ret; + + ret =3D folio_check_splittable(folio, new_order, SPLIT_TYPE_NON_UNIFORM, + /* warns=3D */ false); + if (ret) return split_huge_page_to_order(&folio->page, new_order); return folio_split(folio, new_order, page, NULL); } diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 041b554c7115..c1f1055165dd 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3688,15 +3688,43 @@ static int __split_unmapped_folio(struct folio *fol= io, int new_order, return 0; } =20 -bool folio_split_supported(struct folio *folio, unsigned int new_order, - enum split_type split_type, bool warns) +/** + * folio_check_splittable() - check if a folio can be split to a given ord= er + * @folio: folio to be split + * @new_order: the smallest order of the after split folios (since buddy + * allocator like split generates folios with orders from @fol= io's + * order - 1 to new_order). + * @split_type: uniform or non-uniform split + * @warns: whether gives warnings or not for the checks in the function + * + * folio_check_splittable() checks if @folio can be split to @new_order us= ing + * @split_type method. The truncated folio check must come first. + * + * Context: folio must be locked. + * + * Return: 0 - @folio can be split to @new_order, otherwise an error numbe= r is + * returned. + */ +int folio_check_splittable(struct folio *folio, unsigned int new_order, + enum split_type split_type, bool warns) { + VM_WARN_ON_FOLIO(!folio_test_locked(folio), folio); + /* + * Folios that just got truncated cannot get split. Signal to the + * caller that there was a race. + * + * TODO: this will also currently refuse shmem folios that are in the + * swapcache. + */ + if (!folio_test_anon(folio) && !folio->mapping) + return -EBUSY; + if (folio_test_anon(folio)) { /* order-1 is not supported for anonymous THP. */ VM_WARN_ONCE(warns && new_order =3D=3D 1, "Cannot split to order-1 folio"); if (new_order =3D=3D 1) - return false; + return -EINVAL; } else if (split_type =3D=3D SPLIT_TYPE_NON_UNIFORM || new_order) { if (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && !mapping_large_folio_support(folio->mapping)) { @@ -3719,7 +3747,7 @@ bool folio_split_supported(struct folio *folio, unsig= ned int new_order, */ VM_WARN_ONCE(warns, "Cannot split file folio to non-0 order"); - return false; + return -EINVAL; } } =20 @@ -3734,10 +3762,18 @@ bool folio_split_supported(struct folio *folio, uns= igned int new_order, if ((split_type =3D=3D SPLIT_TYPE_NON_UNIFORM || new_order) && folio_test= _swapcache(folio)) { VM_WARN_ONCE(warns, "Cannot split swapcache folio to non-0 order"); - return false; + return -EINVAL; } =20 - return true; + if (is_huge_zero_folio(folio)) { + pr_warn_ratelimited("Called split_huge_page for huge zero page\n"); + return -EINVAL; + } + + if (folio_test_writeback(folio)) + return -EBUSY; + + return 0; } =20 static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned= int new_order, @@ -3922,7 +3958,6 @@ static int __folio_split(struct folio *folio, unsigne= d int new_order, int remap_flags =3D 0; int extra_pins, ret; pgoff_t end =3D 0; - bool is_hzp; =20 VM_WARN_ON_ONCE_FOLIO(!folio_test_locked(folio), folio); VM_WARN_ON_ONCE_FOLIO(!folio_test_large(folio), folio); @@ -3930,30 +3965,13 @@ static int __folio_split(struct folio *folio, unsig= ned int new_order, if (folio !=3D page_folio(split_at) || folio !=3D page_folio(lock_at)) return -EINVAL; =20 - /* - * Folios that just got truncated cannot get split. Signal to the - * caller that there was a race. - * - * TODO: this will also currently refuse shmem folios that are in the - * swapcache. - */ - if (!is_anon && !folio->mapping) - return -EBUSY; - if (new_order >=3D old_order) return -EINVAL; =20 - if (!folio_split_supported(folio, new_order, split_type, /* warn =3D */ t= rue)) - return -EINVAL; - - is_hzp =3D is_huge_zero_folio(folio); - if (is_hzp) { - pr_warn_ratelimited("Called split_huge_page for huge zero page\n"); - return -EBUSY; - } - - if (folio_test_writeback(folio)) - return -EBUSY; + ret =3D folio_check_splittable(folio, new_order, split_type, + /* warn =3D */ true); + if (ret) + return ret; =20 if (is_anon) { /* --=20 2.51.0