From nobody Tue Dec 2 01:05:45 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 From nobody Tue Dec 2 01:05:45 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 567F72C3245 for ; Sat, 22 Nov 2025 02:55:48 +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=1763780153; cv=fail; b=TsfWmcY5+NNbkhiHsFWutc2iFITv3WYVoJuB65ftiRrQzU82Iz+3M9whbIY92LhrT52XPFcS5IchvTDEuVfyjKm9z6pK3MAuLKcLTFhwcFRHVaizw0zcc7prczy88p0GQIbAGrH2fxjeCVNDi5wmcMdyktufMTUFRookGO8Xihc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763780153; c=relaxed/simple; bh=Tv1kdM9B59mRyK4iythQpiIw77H7K//V0ldLrJSWJ9o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ojt1rzsWPLBbTsGh5Q5IPnjm8tdidEHRqMaNfBp3gl6s/JGsf/ccrVlRVhU4RjHtg6twmVCgogJmg8KBDLdDsvjzyHDUXX+OPIWsndCW0kiNv/i+17yEWKA48AOciUAKXQrwBW0AXZdfFS6iZtfqgdftk2MFY+cJBS6JWkpHXRU= 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=N0lwITSq; 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="N0lwITSq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PcmzkzKq7woYHuS+1ceOIDyFJPwE2Utxae++yIIv7+qb9weUHYIkCPQ4iKA2FcVykkgyqOtj5aqhIEDeIYa+Eyx9GgPVIE0eA3WONDW23MIpVPfLB7c3jPezp3ugZXAcd+OpspueMHFIKm78RSaXQhhoH9Hn9jJJpo/PDs5bqrBPkKGH7qzwVx9MZbG8gU7wNxnueXLJprd/3ID1IGPH9efCBAWIHKHhdIzSe1D8Tok4YfIqX3MoXqvGQw9nag7VVZSE/VD0Dnhi81ku/h48+1eWWdJciql81kmTFd94N1I1b9KJr/oHLj5iJyQFSdkUhHD7eQBROX1GeUVHOLD8kA== 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=O7L7mUcs93JgEshzoB8bMVmhF3rXOXV/UEU8bbWiJMM=; b=GzQZB8aHJlmCP5DJYtkJGbIVBfz4Qnb50OUBIivyEuYVNwuAc6DzG4CyykLPYcrMhWNPSKQGsSGn0tY96c+ieMRc5ufmnGTLwSM1lyx06j8GQDKeRD3t11majXNHakC+V2bFqc9Xd4r2ZSchQmLmCqyhEJldSKLP+UfK+cVjZDwzL5f4IO3IEPnV+hOybzG5QL52prXrHwH2gOXhC6dSl+MuUTG0XYniUE6QByeilVrVYlvlPR9eeOQaBNWTjuJ5V7xpCKmRMEF4Cr51QlEtlj+dwNNYqPD9wFGGepLMkoAgLhc2Vg3FenuXwBpWuM1J+1UDkR8bcgLy0zAYofxIsg== 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=O7L7mUcs93JgEshzoB8bMVmhF3rXOXV/UEU8bbWiJMM=; b=N0lwITSqHx1f2Gi3ViAob8gkab5iZwbjxr90FumEFHT30OQnU94I02k5arZI+M1s9Q2cZNeitRg/IJm574I1TgW0W755doENVz89xAhxUhiAXNV2upeqtMdKeIwgm7dBmSWULAHztUC3/XsJL8yNZgzM3tYKS4Vu+O3BWxKVOGmXCjbDXrjjwZMiivQTXZ0NybO/CyQ1ZhOUkORqKQg8wi2mwm5xzNMLonUGtl8VHR2e64qD5LG4zwLax6mu3NJSxPcB30FOBC7eXeU35z2ag1+5P3f6pk0AgymBDQTaiwSyR9V90Xcg+m1J35EE2SBODxHrznemKEhhSh85YTmXjQ== 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:43 +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:43 +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 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation Date: Fri, 21 Nov 2025 21:55:27 -0500 Message-ID: <20251122025529.1562592-3-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: MN2PR05CA0053.namprd05.prod.outlook.com (2603:10b6:208:236::22) 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: 8fbd61ae-ec75-4d11-320d-08de2972a07d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?DOUVyfarF5jzG+cLhzZE7UQBKSS6jlS79FKPVfhVg1KYZ02LNAwdG7WTTePi?= =?us-ascii?Q?4SUQLBUoN+ecWBno3YwKORgwC4/n8VfifT+15OCqSZH7CXWOKZCUv11j6yIX?= =?us-ascii?Q?V2Xj3ljabYfm5t7exUt8oOQ3bBctri2k552J+IcFWes3S6YtaKfy73sFl01M?= =?us-ascii?Q?YHp4eqaXETZC+GUZhqEkUa2m2UErdKaptWKNuqYlmp3qaXooyPhvx9P6x6yc?= =?us-ascii?Q?joQvA993UH/W6gz+ztCQJMTq6+aRX8lQPEw3tNlDqjACssa22tla3q6NuY+g?= =?us-ascii?Q?s64mOfvAsDyC8E34LlvGtn46tm/qq+j9kCEK9HRZdAULybN4Bd149+bntyDx?= =?us-ascii?Q?ia/CnAhlFG6OmQgrTn7zFDeFHoG/1ufZPEoI3rtShrzTQr55lYtEglE+cub0?= =?us-ascii?Q?9ERpYBx5nJxbot+bmz0GjiaJWyVJwXajjQEVErQBuQF1iJqksUq9FXYSXyH1?= =?us-ascii?Q?U8a8hnqby+fYwYJXd2mtAdF82MT7x6yogAfEOofTaguhbwkLnPbdrO9Xq37z?= =?us-ascii?Q?vtz1Vre4xN6TZcjUmdnvi7lxBlXWkMM0oaZ0u+l0Rv2bjJreVq+Pw6F5ntQ/?= =?us-ascii?Q?5bHRQrgKq05cHmgAaW7NgGCOcrH7w2TXna/Y7RmqJG40+/WShBjKGa9ywI+g?= =?us-ascii?Q?QZ4srddU4lMoai9wuK/ny0crFFLqEHz5OgIsdJGz6L+d7U/SeeHGCqPiu7Ui?= =?us-ascii?Q?CjGEhnyT684uSYNQlEuyEsL5KdGzHVpLHSMwTkRQtHFnkD8ISDTcruhXhziM?= =?us-ascii?Q?uviZeKwrAiw7D6J4XJ8eeizoAYVHtgZJ9Yg3dX4XpjOpzGkMcaunz/Q52+u6?= =?us-ascii?Q?6U9pnvkOrrma19KEm2F26drv2JOvxzDgzPwwcGAne+ZJKTJ/tiiQQ5BdVqxd?= =?us-ascii?Q?k7W28pOd7vS+Upkkz9/nvuZ4NVMMrdCRqplqMN46zDfN4JsCSKC1HwqByBAU?= =?us-ascii?Q?f1vG91A0Dfc6fWt+iScAwmyJEUCqxi2ft80OGpNkLFXX4V/+B7uoLs5i8xDb?= =?us-ascii?Q?NdtttEmFKdkfzhzYzOLREqjbdmx6+VEdwloFReZkm5IoxI76B1wfh1q5b3CO?= =?us-ascii?Q?MTCLogaK7FjDjEbzMDJKeY4gFnI11TIQisrCfJJtBdGzQ+9MErv94rODuZK+?= =?us-ascii?Q?tOApaEDspB6Jbk6KAsSXR7ric3JRAbEmaLDvQ+AXoUKEQ8lFZfuRte2pZ6GU?= =?us-ascii?Q?Ve0tWWbuTNH2atNveSwj+bz2qcsPOA+IfWtEiG8emkPUuJwIAzegpdLjKVFL?= =?us-ascii?Q?XFVpq3h70cHQakualiwMvYsZPcl4Rk0Wg+073svB65XljM0aVUfvxUPrTXQq?= =?us-ascii?Q?wlAWy1tK12CWQssQDhyDw2RhsOnWCI/c2WU/CCYn9oVQfrL9JJLmsxHt0QdD?= =?us-ascii?Q?zp3XjChP4B9MOLEy5AWmA3JzkWSc9nhShbFwwPOvMemoUYfVjaNZIh1748Gi?= =?us-ascii?Q?UT8ewlZFE3DP5Xw8YC6NmppZIwamx4uc?= 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)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6UI/08FV+A+HB4FUT3+muJCCd+nKpN8/Ga8ieej+8Nf2Yxmf8ZLXSMUBGKYp?= =?us-ascii?Q?vLW3uKHQI551Dqym7cB2BZoS/y2vRBGZkrMKt+aqxQ0VW+79ltetg23CEGp8?= =?us-ascii?Q?qOi5ywZZ4Z4YfPSrDkfs6kAOEwgaYj9bYzttB/cA4dCW5RcsAMm36IYBTZQH?= =?us-ascii?Q?7Ro7GSUoluKy2bnGms96Gr20G6RFnEPiOMBxmvVN793XzZLmTlSg4W9VNY8c?= =?us-ascii?Q?/hpGU5UCh2CKc5nWzxVUe3FcIhm5HIZSrpX7xvjrMMcBtw6opSjqpluQ45sp?= =?us-ascii?Q?BLc6SyJbMSNI4/0WEvmUfYZHd1C9+4efnox6g11cjBgms8SjMKXKa7dd6HJl?= =?us-ascii?Q?IUMXf2qe6fsbDcXEJjdas11/bBeqObxrv7epjxVTJ4GezhcydgxQFgrGALkJ?= =?us-ascii?Q?74CjIUKaeLMPUX6tIybIMbw72BKu/ajuodKP41FKdg+6f/VIEuOqHXPSg7dI?= =?us-ascii?Q?JQePtrIgwop5pR27wszKifgLG3j4l8qoSmWVHk6RMYZiWNcqmq6YvBVdw293?= =?us-ascii?Q?dluF5lNGqptJIRFomnYHJMninlHK025LjpEGIkVsdsLm86OZowO/we/MVMd0?= =?us-ascii?Q?yblYotJeY7rclryncIKvgB598UJazdQPp99VGb6YeEbiSqK/E3W2i4AiCU7l?= =?us-ascii?Q?qSzIu/912pHX2VtJLEfVfDM7hhOy7ExJi7hHd+swoSMO7gxwerNH0J4viEwy?= =?us-ascii?Q?FCZa8X1hV7oP9PX7BEINsZNCCTAnfWbCSBVwnnX+drGpCYhbJHsNtVTy6DYR?= =?us-ascii?Q?iSTzwWQUrt8gHu12L4OOTK0TgqL8bRx5U26l+EfxA3G8rXo9i3b2xBi+Tji2?= =?us-ascii?Q?jCgG7SP3d7ky1+g3I7XHVsr3wVABMhKTosq4syLiw1HiA2E46Z0NZ6rjr2lW?= =?us-ascii?Q?ArVswWkYsGcxC8lH0Nk1SLFfZ5EXpZxDYRMQgtXU1HrZk64oy9m36A3RnGRU?= =?us-ascii?Q?LJMvu5P4/vmsgiKCiNQ75PmfriF7BTZOO8daCS/eV0TxLM94iZ+L31OcL7xi?= =?us-ascii?Q?56iuBE0iME2dSI7wNG8rR3gtjehkh7zek+PnDTpiNYlw8Fnk1yl+NS7Uv6M7?= =?us-ascii?Q?pkeevP5QVR2U2W7MJ0fmItpkDtdRjYeq6Tmts0yrIgZ0yPgSmTVpf4waJjmZ?= =?us-ascii?Q?oN3i212w2SEK/D1LcxC6NzEhQL8gcntVb3B4Z0ZWbGaZyNoLPeMkPmxKYhrv?= =?us-ascii?Q?Zt1EQf9Ym1uOm4KOO+TBCtemQXQ8wl0GphTVjbFnwyjOGNVQcpYyRb9pVf7/?= =?us-ascii?Q?dEYTPwJmHaFBcuo4wTOxheldP1TaxG55n9J0jwlZ97fUrPMMtlKTBlSlcpez?= =?us-ascii?Q?EmW9MhhQH9htXGnCoyWjqKCNaxXK6ALSj2Xp0v/BSuivOxD/wEwP/uzEVm6A?= =?us-ascii?Q?xOWTOT6OIap7khpN6YaHwLEw5IwtXipsNL/N4U3uQrE7HddW416Aan3gaclQ?= =?us-ascii?Q?U4nmXHuNzd4IiN9UEf/bgbaverpLpMjlk2RkD13PQw8TC1T9lzQjafEsqBfY?= =?us-ascii?Q?OXTjyS6QMDhUO/IaO2xwBi+rp7q1Kng9rSzCYm+5bGvzlTtJ8HGpGvNeVVay?= =?us-ascii?Q?CQyZq5tCF4d9oFNKRJRtwynvk6wgAQBmwpLeZIXt?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8fbd61ae-ec75-4d11-320d-08de2972a07d 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:42.9641 (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: kWtHmiMLx/XEvuXfuaAYjbOqBEIqyYYV8ioeC0Y3VepYeI9aL/ctwsfS3GU23jw3 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB6994 Content-Type: text/plain; charset="utf-8" can_split_folio() is just a refcount comparison, making sure only the split caller holds an extra pin. Open code it with folio_expected_ref_count() !=3D folio_ref_count() - 1. For the extra_pins used by folio_ref_freeze(), add folio_cache_references() to calculate it. Suggested-by: David Hildenbrand (Red Hat) Signed-off-by: Zi Yan Acked-by: Balbir Singh Reviewed-by: Wei Yang --- include/linux/huge_mm.h | 1 - mm/huge_memory.c | 43 ++++++++++++++++------------------------- mm/vmscan.c | 3 ++- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 97686fb46e30..1ecaeccf39c9 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -369,7 +369,6 @@ enum split_type { SPLIT_TYPE_NON_UNIFORM, }; =20 -bool can_split_folio(struct folio *folio, int caller_pins, int *pextra_pin= s); int __split_huge_page_to_list_to_order(struct page *page, struct list_head= *list, unsigned int new_order); int folio_split_unmapped(struct folio *folio, unsigned int new_order); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index c1f1055165dd..6c821c1c0ac3 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3455,23 +3455,6 @@ static void lru_add_split_folio(struct folio *folio,= struct folio *new_folio, } } =20 -/* Racy check whether the huge page can be split */ -bool can_split_folio(struct folio *folio, int caller_pins, int *pextra_pin= s) -{ - int extra_pins; - - /* Additional pins from page cache */ - if (folio_test_anon(folio)) - extra_pins =3D folio_test_swapcache(folio) ? - folio_nr_pages(folio) : 0; - else - extra_pins =3D folio_nr_pages(folio); - if (pextra_pins) - *pextra_pins =3D extra_pins; - return folio_mapcount(folio) =3D=3D folio_ref_count(folio) - extra_pins - - caller_pins; -} - static bool page_range_has_hwpoisoned(struct page *page, long nr_pages) { for (; nr_pages; page++, nr_pages--) @@ -3776,17 +3759,26 @@ int folio_check_splittable(struct folio *folio, uns= igned int new_order, return 0; } =20 +/* Number of folio references from the pagecache or the swapcache. */ +static unsigned int folio_cache_references(const struct folio *folio) +{ + if (folio_test_anon(folio) && !folio_test_swapcache(folio)) + return 0; + return folio_nr_pages(folio); +} + static int __folio_freeze_and_split_unmapped(struct folio *folio, unsigned= int new_order, struct page *split_at, struct xa_state *xas, struct address_space *mapping, bool do_lru, struct list_head *list, enum split_type split_type, - pgoff_t end, int *nr_shmem_dropped, int extra_pins) + pgoff_t end, int *nr_shmem_dropped) { struct folio *end_folio =3D folio_next(folio); struct folio *new_folio, *next; int old_order =3D folio_order(folio); int ret =3D 0; struct deferred_split *ds_queue; + int extra_pins =3D folio_cache_references(folio); =20 VM_WARN_ON_ONCE(!mapping && end); /* Prevent deferred_split_scan() touching ->_refcount */ @@ -3956,7 +3948,7 @@ static int __folio_split(struct folio *folio, unsigne= d int new_order, struct folio *new_folio, *next; int nr_shmem_dropped =3D 0; int remap_flags =3D 0; - int extra_pins, ret; + int ret; pgoff_t end =3D 0; =20 VM_WARN_ON_ONCE_FOLIO(!folio_test_locked(folio), folio); @@ -4036,7 +4028,7 @@ static int __folio_split(struct folio *folio, unsigne= d int new_order, * Racy check if we can split the page, before unmap_folio() will * split PMDs */ - if (!can_split_folio(folio, 1, &extra_pins)) { + if (folio_expected_ref_count(folio) !=3D folio_ref_count(folio) - 1) { ret =3D -EAGAIN; goto out_unlock; } @@ -4059,8 +4051,7 @@ static int __folio_split(struct folio *folio, unsigne= d int new_order, } =20 ret =3D __folio_freeze_and_split_unmapped(folio, new_order, split_at, &xa= s, mapping, - true, list, split_type, end, &nr_shmem_dropped, - extra_pins); + true, list, split_type, end, &nr_shmem_dropped); fail: if (mapping) xas_unlock(&xas); @@ -4134,20 +4125,20 @@ static int __folio_split(struct folio *folio, unsig= ned int new_order, */ int folio_split_unmapped(struct folio *folio, unsigned int new_order) { - int extra_pins, ret =3D 0; + int ret =3D 0; =20 VM_WARN_ON_ONCE_FOLIO(folio_mapped(folio), folio); VM_WARN_ON_ONCE_FOLIO(!folio_test_locked(folio), folio); VM_WARN_ON_ONCE_FOLIO(!folio_test_large(folio), folio); VM_WARN_ON_ONCE_FOLIO(!folio_test_anon(folio), folio); =20 - if (!can_split_folio(folio, 1, &extra_pins)) + if (folio_expected_ref_count(folio) !=3D folio_ref_count(folio) - 1) return -EAGAIN; =20 local_irq_disable(); ret =3D __folio_freeze_and_split_unmapped(folio, new_order, &folio->page,= NULL, NULL, false, NULL, SPLIT_TYPE_UNIFORM, - 0, NULL, extra_pins); + 0, NULL); local_irq_enable(); return ret; } @@ -4640,7 +4631,7 @@ static int split_huge_pages_pid(int pid, unsigned lon= g vaddr_start, * can be split or not. So skip the check here. */ if (!folio_test_private(folio) && - !can_split_folio(folio, 0, NULL)) + folio_expected_ref_count(folio) !=3D folio_ref_count(folio)) goto next; =20 if (!folio_trylock(folio)) diff --git a/mm/vmscan.c b/mm/vmscan.c index 92980b072121..3b85652a42b9 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1284,7 +1284,8 @@ static unsigned int shrink_folio_list(struct list_hea= d *folio_list, goto keep_locked; if (folio_test_large(folio)) { /* cannot split folio, skip it */ - if (!can_split_folio(folio, 1, NULL)) + if (folio_expected_ref_count(folio) !=3D + folio_ref_count(folio) - 1) goto activate_locked; /* * Split partially mapped folios right away. --=20 2.51.0 From nobody Tue Dec 2 01:05:45 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 C438C2BEFE1 for ; Sat, 22 Nov 2025 02:55:53 +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=1763780155; cv=fail; b=bPgaN0Gl6zR/WHrcGZcWjUgjmVazrkmjjJVLO27KeEEzeV/I1vIZUDaLine6VEoycyr38Y2sHTIikRDAHOt4J9bL3pbNBWGjLAgp3X6IKN0XaIf96cFCQnmzEKHMla7404lUq8LYMHII9dNBUagZ8pc451mhVBgukVLN0r9WPyE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763780155; c=relaxed/simple; bh=amfS8W1VrXmTge5UBR3pSHTGolOJqC8JCTxHP23tCr8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=K2lMpeZDDYVMco9JlT9wTR65MT2ylOxoTzoIVwiq3uFCX1vYBSGaG5PpnKDug3UXWj9JWFq+GG2muTJnNPa890AcX+G2+VOGs//UJSxSfTf3ZcA/PUDdUQfw7ZFQg8Q+0G61j5cAo5t1VSioMJDyR9OkaoJVE7PLqc4PY4KiC7w= 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=Gcz3LT+0; 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="Gcz3LT+0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eB7MerBioOwaE4V9KSKGq6BkEoAWv+3zy6JzNXL2oxRrj+t0iILheFLth8UwFaiLZ2yrWntxHKCWEXe6M0y4lLcI/vEkSUcA8lF2P7cmICuKoilszW33DiPAx+1ab9NkEUU4+4s8zUnif08ojmvX9chdMKZuUcfLkVBL8Ucqp+bbKv7CkAwWiGr/B887MNn3gdyEwwKGGHa0a39cQ5oyHdxjaJCOj4undgW/PMfNMU6Y7ztb2ewh0Dg9EPgBSSrpXcAYIxzuukVmUq1EycntN0OBWL2iVthGoul7py0dnJ8ySjWaa20drCfXmIv4hDg29hWP58cVCT9XDZxf+uf3cg== 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=JMlIQZdXjPVxu5O9IU+5Ch8Lt286wZMwzhJwd4Uv22s=; b=cvCn9JmKSTzu0eGmOyYH86Vuc4nTFEQh1tV0fK0teqJWJReywXWu1SKHaIqhhPxmT/CU38Ve2qMgM4+OOSGSBUKk7byIpehf033TDx7NYO7uLL4X71kiS7Y2EXm2ThB+YN49zTsFfs1FhX11G6GMTXWdP6cTAZOdtkNNqSI3b5fxici/1Etv6tpFZZoT7DW1pN9X+yZRh2PEJQdRY8YGaRGgwBsFnuOVnH/U1dMySJ72KAd/1GR6pRHd53U9NKuwEb5qic2UFSLEO6UuCOdtdgNy2CfS0jjYOhmvW65a3tm4dNg31vLJhMVgL1TEdxOM+Jv1Bq4IMtEMvi+wWK+a/A== 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=JMlIQZdXjPVxu5O9IU+5Ch8Lt286wZMwzhJwd4Uv22s=; b=Gcz3LT+0/Yt967W2m4gtDRgEE96aJSz8s+xkmnfNWnMF4QuzNuYFbVl3e7nVCoKW0Oz2O1rW1pIwUhfYWNHkhdxu4l1bYSA2GPX8eFfeKoZ5xxMkrHKM4o5Yo+rzVG2nWe/RUyKqtfzSv42ADGJqsQMcEJQzTTXema60YDlDP4wdx9aH86DUU8Na+bBs8ZXxbRxtWfUxu4cmPbBMFgvUXk0nxjZ0rZ+CPDfWVneE7YfEWJYN/uDyeqS5pbLVptNjf+uiSumhUoCLLtVCO4mjeGWjWtsJ4Dgyx4F8i3G8WWUR8SYCPc5OLlYtUb7H1cRQgz1XTSpP2PGgCui4YuLmiQ== 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:44 +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:44 +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 3/4] mm/huge_memory: make min_order_for_split() always return an order Date: Fri, 21 Nov 2025 21:55:28 -0500 Message-ID: <20251122025529.1562592-4-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: MN2PR05CA0063.namprd05.prod.outlook.com (2603:10b6:208:236::32) 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: 91d8b110-b674-401b-4084-08de2972a157 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?Tpv3VHrMYu37hXiz4Zt9bNifZ1seDfxLGPYpGU+cj9xqHZBPlbIg16afVQQk?= =?us-ascii?Q?Ole4rGaTAlEbVYHMLHEOtmGRvX0XcApxahWfgvmIeSsaAe0uuS8vq2+4u+9/?= =?us-ascii?Q?mEBG7f6+OlY4+PVs2wBZvXtkBwHzl9yN1zC6kTBg2hQTU8tNrETV2K2iTigK?= =?us-ascii?Q?TAG0WO1RpG2J1JK+5d7st3wj89clvoxPoV9F5zfwo+TzVnfRcVBLofSJWqzM?= =?us-ascii?Q?HH8+wUhdJ+CDAKraCy85LtZaz1O3wvXI7HtxbukyIEPVP9z5/e/rnTessGV0?= =?us-ascii?Q?Ni2f1j9fk3suNIXL9VLj2yqW/HsS6Z4YOHZpxuthxIt9y6UlmD3toQCWiq5S?= =?us-ascii?Q?L/aUtmszYg1vROK1nIxBsVzYB7dDfWRboqaPjQqkbZdIk4/SXyHBTH87GcHA?= =?us-ascii?Q?zZab+M76fw6gs9pd5V8XvS97km5irnMEKSzLCcjeYOllqsVOwhpWAeejRmIV?= =?us-ascii?Q?LEPH3Gz1TORhPVxofaN97kf0HwOBSmYd9cFcHio1ORTGFOy1KwuMuib7akPD?= =?us-ascii?Q?0+sQb0nxrLk3Ci3HYQREVpVTM0uePvSKlXNSVKJ9p76P/+kuxU5y28CosmTE?= =?us-ascii?Q?59J/8lrhZO5JLY1ZoBW7h8egpk0Hseo1kA6RzZiGqyRHmKwlmu6Qs6rPseh+?= =?us-ascii?Q?pAnQw9XRtmXBHqW8gXs6l6l3iolJC7x6PEQtgVao0jyKvC+jSnymYZwjPosV?= =?us-ascii?Q?gd3JsQVCNn8D8OOtAQ1Q0jdEDblqEzFSSZ0gauJGOVUnUdkxmBX+Hr2e7LG8?= =?us-ascii?Q?ikPayVcYiNaqLkO8YHxrBdEuBqVy1+49xNJ2HeENM+SihAkY0GF8HtrXH0mC?= =?us-ascii?Q?/nxXwf6w6l8yPhySsFZndSTv2iLk81FlF+cxMLSChQoszzdC1FMP4nKEQ1jM?= =?us-ascii?Q?noSBUqK0hi6b97DFmJAmlzhqjGCDFErf+Y/stGd5uQiAAul7ylF9HiL/7vTb?= =?us-ascii?Q?VIHD4pAEHHiryzg35KmzebVqhWYocFB2YUaPYl0zRxTstiRq92dw8pXkZBRa?= =?us-ascii?Q?Q5atGJZyaClGtv5U5FGFY8nyj6A/S75a7tLJE/085UXBf8WD9ddaif6b9YWV?= =?us-ascii?Q?qvcCIM2ii0LA7c1ODlRYfPKOFL2kMyihHh99+AkCF/HgXjsabMKZakKUMlW8?= =?us-ascii?Q?oEtwiXjlZ7ZE6hfgTvdBoOlFLDQYgIHujVwF+qo4OdjXS22jYtahKx6Uz+Sn?= =?us-ascii?Q?1CIhEphia7YC6dOsmZSulSiSiJ1pk45+cQHFiAg/VxKwtgxuNUzx3Z94mV4A?= =?us-ascii?Q?GzcQG+XtZ/7BlmjNStaNOYsl6reuL6Quv9Bp2QM2jps/S9aKALZ7BORNPO0r?= =?us-ascii?Q?OPqBuO3/Sih5t0IIW2enfDa4Gsxpyv40iS995qwtaMtY5gFA/ZdIfObtdY/5?= =?us-ascii?Q?aRTp4pNhvHXKGkg5YGF44/u3j4RsAc7hKs0FWJlsnCCN1Q/N5rPdH0gJXhUY?= =?us-ascii?Q?K6f/wGVh25GGoN5uR88axJ9Y6QW/tJou?= 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?ufEAnhJ1XBjJBjy9mUq/XfL5IuNpFIYx60R7PdDcedXwR0G/iYlXry4uekd2?= =?us-ascii?Q?2yVALoMTs93fXvdVboMi1t/94eLN/fQfWgmjlHcDGY2pobakiqLVENP2s6iy?= =?us-ascii?Q?bQK41xc6CkzUGrpGzyLHxeER9lZYGW0rrYT2Zd+ZGkVVV27hagxbot6qKjTP?= =?us-ascii?Q?mmkFpZEg2M2BicHfDQlwFkxY6coj+fxo6ZwXBn91CxMDWchR6v+GA2f0E4lo?= =?us-ascii?Q?d/GrAuaowHg7hkH1cQ+fzsK4sWwNCGuEElVS4gsOlujcCAP2bScrt2JThMI4?= =?us-ascii?Q?ZhkaXMf74GEfhaZaoU/nIhBakzPrn89iPnT8cd+EZLVutzveKYLOo4UCUK6p?= =?us-ascii?Q?MUpc3S+dqzEq6aow7EsE3p+ilNTLtZQ7BOaUjBiBROF96F3DJ0rDWnL9TU8h?= =?us-ascii?Q?E8kGMTW0nQduh0NJ4JU1E6KhrNco1vQuUb+XpZ9Xs1MC8Hyn7cTMGmy3awWv?= =?us-ascii?Q?MI6pTMeCu0sGKPYN6+WRZCaDSAeHtcM/OJVtQrnouJnU2krl8a2u4XvzBUSl?= =?us-ascii?Q?F7fbm+XpQp4zcyEJgGKNj03uCMk9IjOe0srAPPufxCnL6zZwZM59sUvD/tod?= =?us-ascii?Q?5oE64K5bNlAGmwRHItTL3rjf8GwqPy2zSTbwxfvhxvEHvBhlybvk7VU6Jhde?= =?us-ascii?Q?rAU0k1UIbQzavivlsMVm1Q+Grjt6vKY9Vf1aJFs8QVQa6uwc3fzpLvSBWUha?= =?us-ascii?Q?/4zejhXuGHSh9hgHvbBBYTWU+wTr3G+DEVKvTR7Fod/mEz5tiysTi7s5329X?= =?us-ascii?Q?c7kfeEme/wOa2gcuo9o629qTdeMF84Etx+6Xi3Jf8lhKLHZPPM6pCfiYt40Q?= =?us-ascii?Q?JhSQdaBKLb7FPSF10mykWfsJflA74D3s9BrKMe8jHckCv/TXGhG51mFDX+EF?= =?us-ascii?Q?x2AkDhDUy2wQHsKr0DXMbmVh4PHjnLQPOEHUXNsNeSQVYuIhSF7qTL2+939a?= =?us-ascii?Q?xS/r7480/6h2iLViINPv3DmhByX8BVFdU9hkTs016knJ3Im/9Uf1kR/zDBaG?= =?us-ascii?Q?kiNOswWiKzzITlpQSJT2jpHu2KIkxFw/yLsxdNEU1S6f5BJvy7jdqYdr1ARD?= =?us-ascii?Q?aNI1d6a3pLZ91Ce9fXdgODhi4AHA2x8KmaPSrMaWEO7IrgimMFv5K6zrr3up?= =?us-ascii?Q?n3Jj4y0PH1/n/0IePDBhWAtGZ/PYm+Ugm7HPGfe9xb75hlWMw8YgPR/yAYnl?= =?us-ascii?Q?ezqptJN0Y9qfGUxx8JrQ7nrTeqyDyLkHZXq2Rtdt15jCLXK24zFEd3BJtwYX?= =?us-ascii?Q?SICKXRoFzybGnfy/ygt2ErstYgSFBHgf2dG60SoHzQuTwXBFebc+wg8yQgdK?= =?us-ascii?Q?sYwpe6y9MQpIjgIPdAcPFEmogLt2bDu0zp617uRRFBIQjkZKbjDqv2WJE9Hy?= =?us-ascii?Q?pNppkRQ1wmQUdlvqt7I6/5mkK975cvmVOQgA+ysKflu7ETNJhk61JKfau2js?= =?us-ascii?Q?J2s0qYNSdaKRqekxweSCjxxahlgxPT7duUgoC/DRbUUkV2ZmVI3jzRTdsWVv?= =?us-ascii?Q?jH8hp+QNE2Jo+/i5DDzjRT9imKhXypLbQEQlbUtwtg1cPw81LK3o4xzz4VPM?= =?us-ascii?Q?pJE61QYb6HuGiYaDpHJclD7n/+TfY6XfaYPrpXwy?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91d8b110-b674-401b-4084-08de2972a157 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:44.4140 (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: SOMrFZTHIyT/QbJmAO/VlqeWODRsKZvlip4hT1M4ETDvkNHtCdwJV8CCB2q2A+7G X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB6994 Content-Type: text/plain; charset="utf-8" min_order_for_split() returns -EBUSY when the folio is truncated and cannot be split. In commit 77008e1b2ef7 ("mm/huge_memory: do not change split_huge_page*() target order silently"), memory_failure() does not handle it and pass -EBUSY to try_to_split_thp_page() directly. try_to_split_thp_page() returns -EINVAL since -EBUSY becomes 0xfffffff0 as new_order is unsigned int in __folio_split() and this large new_order is rejected as an invalid input. The code does not cause a bug. soft_offline_in_use_page() also uses min_order_for_split() but it always passes 0 as new_order for split. Fix it by making min_order_for_split() always return an order. When the given folio is truncated, namely folio->mapping =3D=3D NULL, return 0 and l= et a subsequent split function handle the situation and return -EBUSY. Add kernel-doc to min_order_for_split() to clarify its use. Signed-off-by: Zi Yan Acked-by: David Hildenbrand (Red Hat) Reviewed-by: Lorenzo Stoakes Reviewed-by: Wei Yang --- include/linux/huge_mm.h | 6 +++--- mm/huge_memory.c | 25 +++++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 1ecaeccf39c9..9b3a4e2b0668 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -372,7 +372,7 @@ enum split_type { int __split_huge_page_to_list_to_order(struct page *page, struct list_head= *list, unsigned int new_order); int folio_split_unmapped(struct folio *folio, unsigned int new_order); -int min_order_for_split(struct folio *folio); +unsigned int min_order_for_split(struct folio *folio); int split_folio_to_list(struct folio *folio, struct list_head *list); int folio_check_splittable(struct folio *folio, unsigned int new_order, enum split_type split_type, bool warns); @@ -634,10 +634,10 @@ static inline int split_huge_page(struct page *page) return -EINVAL; } =20 -static inline int min_order_for_split(struct folio *folio) +static inline unsigned int min_order_for_split(struct folio *folio) { VM_WARN_ON_ONCE_FOLIO(1, folio); - return -EINVAL; + return 0; } =20 static inline int split_folio_to_list(struct folio *folio, struct list_hea= d *list) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 6c821c1c0ac3..ebc3ba0907fd 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -4230,16 +4230,29 @@ int folio_split(struct folio *folio, unsigned int n= ew_order, SPLIT_TYPE_NON_UNIFORM); } =20 -int min_order_for_split(struct folio *folio) +/** + * min_order_for_split() - get the minimum order @folio can be split to + * @folio: folio to split + * + * min_order_for_split() tells the minimum order @folio can be split to. + * If a file-backed folio is truncated, 0 will be returned. Any subsequent + * split attempt should get -EBUSY from split checking code. + * + * Return: @folio's minimum order for split + */ +unsigned int min_order_for_split(struct folio *folio) { if (folio_test_anon(folio)) return 0; =20 - if (!folio->mapping) { - if (folio_test_pmd_mappable(folio)) - count_vm_event(THP_SPLIT_PAGE_FAILED); - return -EBUSY; - } + /* + * If the folio got truncated, we don't know the previous mapping and + * consequently the old min order. But it doesn't matter, as any split + * attempt will immediately fail with -EBUSY as the folio cannot get + * split until freed. + */ + if (!folio->mapping) + return 0; =20 return mapping_min_folio_order(folio->mapping); } --=20 2.51.0 From nobody Tue Dec 2 01:05:45 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 7B9AB2D7DD3 for ; Sat, 22 Nov 2025 02:55:55 +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=1763780156; cv=fail; b=tTKjtWmuZbcw9327LOaa/56CzSkwWWfd5gRq9+WBHrlJpND4WMOu1IQUw7P/SUrzsK2Z7JlSwqP2RbqWkdM+BBiwilHbsXktO2ikEKL+WhslLtuyny28eq3K554dutPaXESySkn0hgP3GPp54abZARUY0Rwxv/QBHdwdIGF+nHU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763780156; c=relaxed/simple; bh=ulrC7bVL8xD8bAmlw1diAlBng8UGAm+6glUTLu30RaE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=SjJHtpZSUVExXVbABMpBJPtxu6PjjDxO5gSKeGP9KxbVfTp9/5VUv1ngOkE9+3i/MC+ZtTT375WsABczVVLQW2LZJy3rO4fQ8/pp1CBKS8VrFiSXiL4ARi4q02VdTuhMmmewvoGf60a7WeHZu8Kfczs+URKIsZRKVXU2VNVUypc= 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=hhQxn+3f; 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="hhQxn+3f" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wOUFGROqPfv47iRi+YtUlU4V6v3ErUKxGxR58ENUwMeDjtXCdBJEloO4xqnO32PufJHFd5WQl6SbmkjiV7ERAIk8UHls4nm+e8CkHgODDWP7QaUANxxPqcXAZ1Uk3pgQmlBKfcQm/mf5sTUDLdbeC9F6bLWxUkwutB5MUY/7f67atTIM80Qu4CMdPBPT2Zql175hG0mAr/7C2A4Sr2pnQga6+4VAobNOLyugF7z3ZeUkwobSVk6dytDZHSE0Tm1/sfSfexA3+qHti9b0Ot3MZYdaZUm1y5n8lZZEmLXR8uTLj7kY6r5CtUmXhuPWCrLSCeCBn0K4oAKFO1cBZm9ZMg== 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=xBJCxjnu10vrMgxm4wOSGPIS0FWme8rf8I/o3kTFE9k=; b=A99jQW7f6ETcJi7Jgls4yvv5lxne9/2JlNEPRpUt2Nc8neNHc/Hjr5spkyY9YQlLoYuLVKxxasIEOrTjbeBxFdQPhYdw/gPCvMRHvxMWNTsr9fgihs+mwGVdsMGgopqrB/rHUHRXtgLn0Xgtw04T0nwdJ1mETCfO9uVnLJ8Yg9L+l85/6jhO8FR6/LjeeIbq8D+TAO1k29KQn+d2A6k1yyS5Ef1FF0qMym8/fJpPYPSt7OljSRJxO2bpEJoFOirDCZ3bCEVILUXuKjgYt6GQ8Ahy7S09AC46HTLwMGB2SQBd3U4eR54BmgKs6gZu3fQ105Mn736hZDZPCdwX7kGMzQ== 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=xBJCxjnu10vrMgxm4wOSGPIS0FWme8rf8I/o3kTFE9k=; b=hhQxn+3fciAPlQFDBeTMPun0ZSv/VtQ0Go+gjUwkbX8BqmtZpdlyc0V9y1fEoXduAbhveOH2JvvWS8mG5DzLBZqmtDQzzNr7gHELyYm5GmfeC1nQmAu8WCmDXiktx9fRaqd6SiWHcVGU7JhrYOg2pGTYLpaybnZI1k2hbaDSQRCUZDWO/tZthTSPKZelJ2FS6RAGqVZ5Sa8ao0mqNmUWbmokBdmBqAlYht1+b4WEdu9P1SaJ5iJ76wM7DYjBmgY5N79JyLpg0fiQ+JlpWHAPYCv/a79d2bFVg+owY5CyQmSg3LomfJYveJE9mm5x74Q7Kb5vKUzcjv186F1yeq+p3Q== 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: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.9343.011; Sat, 22 Nov 2025 02:55:46 +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 4/4] mm/huge_memory: fix folio split stats counting Date: Fri, 21 Nov 2025 21:55:29 -0500 Message-ID: <20251122025529.1562592-5-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: MN2PR05CA0040.namprd05.prod.outlook.com (2603:10b6:208:236::9) 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: d2152e9c-1f9f-45f4-d66a-08de2972a24b 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?OOURs0GB2ljFB2THnZY4OVxUH66CBCsTDa6DkY4e45o/A9/kDy8S1wiFRTTK?= =?us-ascii?Q?piiCvigDaKZ7ppflH95AU1YweBkyqrEIQr/Fgre39zbBCBtcDt1SlTVDlHka?= =?us-ascii?Q?EOT2q4Ez9fP3b5iqOQE3Md/Tcnd72YpdN9OWL5wUU1qgeECuLHbprKsTg4Cr?= =?us-ascii?Q?ncWRs+fD2YJ1h/VKoKyxD7l7uu6OG8gPgmtfdwRTvsJL4UaAf2kWOTE505t1?= =?us-ascii?Q?BAP4BwbBthWNo04ZmiN1w4XUzuXmBL5ghPewAy8wWvxImFfPDoxI9YdgWnTr?= =?us-ascii?Q?jfTabptHhsrvHxSL579QC6LMcKyf/OYmAuU5uO9cSwVJQko1M6+gdX+n90bC?= =?us-ascii?Q?NSabKAeJNyNn16YRfMV0kJ8ltrNcuXQkhGjNW7gwuttqVw2JLO6SxmW5QYkZ?= =?us-ascii?Q?KKsP3WEa8Gil8XJ1JofvywWAiTb4xYWyWiW32aB5dYnIZSdD3hHfJ1uhETo7?= =?us-ascii?Q?nHbOw15k2+qAOy4+GONDpghcfS7y41P9bsvlRh7QDL9R55Sq/oGDqEHg1ozO?= =?us-ascii?Q?sC/Hkhm5dz0xnqVkn8IcdFp13L1AWHxv5LnAVQiG5rVmuYAU7wRKRuBVT9ah?= =?us-ascii?Q?r2gUzn7tkWvbOIm6aFMkNqxRwtEr6G9uzKPA7BT2XtDdeQKjEOQw4+SbhGVD?= =?us-ascii?Q?hKf1t6SSjTcUf+IsXtutVQZ1XH0ralKkL3igRwRfMS41hMZjnsdk6SoArAxb?= =?us-ascii?Q?T3OUybR7ThjlK01kX0tlYkdgaL+/D0qcwyLPf7EHc80DCupMBtT00frHFYrX?= =?us-ascii?Q?xJ+CGfrotbl6aUDIJ+cr8arNGl2wKCG7X1krlhNgIcrrt9LLxxZSPJlt+BeR?= =?us-ascii?Q?SW+ZzTAJGufGBhOd0HkYooz6j5ikiHG/3pZBYMpp2mONRT/xrd6mtlnMu7tp?= =?us-ascii?Q?Mv9p8Xbqy8dHVFbq/lVOCSLewtvjncy1keg17lWdLxwtg2Cn8l4wzxTw3pkS?= =?us-ascii?Q?40EvBntYQyM/GTcfxNk+9yXXQHeLxKutrynE28Hzo2dGDnt6jJiHi3/jSz5U?= =?us-ascii?Q?4leeqi3m9ES4tbcPGW8ua4EYmpEma8QXFRP7U4CPt3Xnr438x9BjNaHoVi2I?= =?us-ascii?Q?wwx0axcWyFTqOjY8644rcDUOkezw9Oc3PiCG3+Sr2M0GIVQytA4Q/R1gVQVe?= =?us-ascii?Q?omOCwgc001g+AxUmblMEPo+VOwGzfDnk5tw2ukiYcMoHulzfb3Ea7HuIbcp2?= =?us-ascii?Q?8sJ+J566UoF4hqSrkMHzxD2bt9j7N/XlzDPwDmuB2cGpSzCvokSrxESnyqMJ?= =?us-ascii?Q?XZBsADvScr/e1CiLRG9fnO5mjlaxJpgkbsWDmNHf3hEbEa4aVREqDreUE4hs?= =?us-ascii?Q?wXqXZy9kHQHE7cjSrZELIjXg8b0pl8KhbXzM1IC3iltazyA8lfbyC4A0IOay?= =?us-ascii?Q?e+NT4FrjhyOrW9PwKyNg7Bu328qsbKGGODZbnLXiiGQIUPncTbc3zgpnuE3U?= =?us-ascii?Q?nvhkpq2gIwYJgk2yPxijhVyuqOnysQJF?= 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?1KPFWT3P1l2lsIE3EoLBWexzJxL7xMW4sLqXrEUqivSvG4sLa79/DcABVekl?= =?us-ascii?Q?wysQmgCxpzgAERp7O+Siej1AholrJng55RR1W3eCNYMFTkt5aE3PwjlPvFo3?= =?us-ascii?Q?fITS/5pnTGVlqyhigWaEv/KjBqmm1/rq3cDFdw9/pl1a116PjJFXROg1azbZ?= =?us-ascii?Q?g7iKlTuZ1h7bmlyrAMhRuNR9PKlZiF+Jff5CNp1t9EbjVKBtBDbtkTYcl/yW?= =?us-ascii?Q?texB/061uV5AWvfjlMr7P1sZwjToPTgXcH0sR1pMm68iu10ynP1n9Dl0jNCb?= =?us-ascii?Q?rRlDMX6YiJrLed/6hjlil0hYcaIM8pm2hnYR7naPF+nVcA19d18Tf5ND51DW?= =?us-ascii?Q?q7AHAwpH6JHfWP4TGVrPcj0PY36OLRLQZqgpDmN6Mg+J6x7pgCF/85cCeXx7?= =?us-ascii?Q?d+fX1dZczN+B/xbjVr5sLqohDKEnbQu725NSBWziangW0bEn9VwpcRP78eLV?= =?us-ascii?Q?F3xRDkeAgJpcfn6blAMBI9KY6GtZ1wHictxIKM6v0H1Sog0Ux2oSivMmDF86?= =?us-ascii?Q?BlsmQ6nYb/5h712SS6wiW1QxEwYK1Ko6bGNP6PtpwEMfZYzeR4kwSBkUpWiC?= =?us-ascii?Q?P24jOwercFlcoFN732mNQRbua0Q0G/lGK9GwgRwhnbu1Na0Oso9c1vPQqXdA?= =?us-ascii?Q?iy+OF5ldZmqPHFzSumIdFG/2F55++oqAgnQjWD/bO9/Sz+GKH6gcapo6uFjd?= =?us-ascii?Q?Nh/jrfPBoieWIb9KLhj+J+/Mgm/HY5oRwYRy0MmFQfL9diEA/DDYQNL3oHNq?= =?us-ascii?Q?Bd9K9VrO33saekslLcNHWjqIHQyK9GDREC8EGlqwBt4qwVu7TWnskL7e6UrD?= =?us-ascii?Q?SBSLVoir0S62mvMANnRLSXPDhVLqKVTk+Hqq9RWV2qzCR1seeFt4HPkD4efR?= =?us-ascii?Q?lokOOtmeOoQaYYYQhOAZ1VpiwkC3k8W3c1w7jRw8hhsSgcltLVuDAzem2IFP?= =?us-ascii?Q?nAn7uN27OVhuTTfnOYllzvXzLxxWMnxx3Fy372CMD2IetNP+ObsCtmSilr0O?= =?us-ascii?Q?QfSqoZQHmrnvctAQROrTjyryAfcjjgospB0vU1+h0bNbndtOXYgIihI6PMt0?= =?us-ascii?Q?i9bhovJHtPGASH1bJ8yEmRQfEm0KDat1Iw4pQCs6BHfZ0VpbDkqwdOc+gyJx?= =?us-ascii?Q?m+d9i1tUznioJ+49+odmj95dqTtSdLw7G61Xk98yOro4s+Wp+lZu3us2G0M6?= =?us-ascii?Q?CllOsEF5UfgoaxaQ+5NSKynVIP8T/MzZQyCeBVfrwjM8d5xy+ItwUpgHPY2q?= =?us-ascii?Q?oyHrvpAOclEgdlJtsGxmt6fPQYpPiXarAOx2TQ7lquLI/bTvppSnOIMqiq2f?= =?us-ascii?Q?cIcK+Q/Fp7rFvjN47zhLcAGeEz/VcTCsvYzsliPMlP2ndHKg5v3s3vlos1ka?= =?us-ascii?Q?iTZKdNl+H7G6TI2p8wd4UXRuNUK96SigzD7UY7Of3OULJxE70oCig1BlmGEh?= =?us-ascii?Q?3mmB+xJlai6fa/jDrQz65mTa/gkH771wt5jRUISRxA82asNzHtRH0yvE3muU?= =?us-ascii?Q?Y0wvvlCIUdLln3204lCiCr8vw2S2xeomdpvSyyWAg5VtPbOOdVzNBTeZQ0oR?= =?us-ascii?Q?LXg22onNg2a75h+8zg4aY5s7D/er2Z63srIIqPKT?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d2152e9c-1f9f-45f4-d66a-08de2972a24b 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:45.9962 (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: 8rHSf/xBtbQ1MFt2vyiAAP1LlOO/bs+A3cDRDEYM5vymbRITfjdvZdx0gTxL1qDa X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB6994 Content-Type: text/plain; charset="utf-8" The "return " statements for error checks at the beginning of __folio_split() skip necessary count_vm_event() and count_mthp_stat() at the end of the function. Fix these by replacing them with "ret =3D ; goto out;". Signed-off-by: Zi Yan Acked-by: David Hildenbrand (Red Hat) Reviewed-by: Lorenzo Stoakes Reviewed-by: Wei Yang --- mm/huge_memory.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index ebc3ba0907fd..a42c4f29ce4f 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3954,16 +3954,20 @@ static int __folio_split(struct folio *folio, unsig= ned int new_order, VM_WARN_ON_ONCE_FOLIO(!folio_test_locked(folio), folio); VM_WARN_ON_ONCE_FOLIO(!folio_test_large(folio), folio); =20 - if (folio !=3D page_folio(split_at) || folio !=3D page_folio(lock_at)) - return -EINVAL; + if (folio !=3D page_folio(split_at) || folio !=3D page_folio(lock_at)) { + ret =3D -EINVAL; + goto out; + } =20 - if (new_order >=3D old_order) - return -EINVAL; + if (new_order >=3D old_order) { + ret =3D -EINVAL; + goto out; + } =20 ret =3D folio_check_splittable(folio, new_order, split_type, /* warn =3D */ true); if (ret) - return ret; + goto out; =20 if (is_anon) { /* --=20 2.51.0