From nobody Mon Dec 1 22:36:47 2025 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011070.outbound.protection.outlook.com [52.101.62.70]) (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 99998263899 for ; Wed, 26 Nov 2025 21:06:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191190; cv=fail; b=n0EbotJ0u2UbQHCTucOpiYagIN1C+5t9/WRc+UXNUTX1u9J4FIjGT4s8H8j1wiNjO+maYgH+PP/V5hovcXhkk72UChj8fZZcdhFKPSi75b/DtoDJVh+uKr3lBnhCmoE/iwy8NiTpLmfQDUFh77tr2T9ibqqnj7g5UFcJEJxpE4I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191190; c=relaxed/simple; bh=90XI+1JcATJu6LvobP986RXOFGFSQ7eEGpGj9K8qwv8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=H42IqAWzV+0lN5R2MdBqOTnpsicI/kJY0AKpTLN4KEeyv7IO6wHBroxfmDerIy+tOcbkHFxG/6N4Ze96vV+gbEKEc7JIJyo5HPUoSl1Vi8pdNJNWzLlst2ubEWAOGHwK8OuZjMGMkFbEsIgxKu0gurgxY5/jrCKajlOHC73us9o= 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=OaSsk1fk; arc=fail smtp.client-ip=52.101.62.70 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="OaSsk1fk" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fzkCknsXRtEH3gbWBleWwafq31J9PFGD9VerULZj8z77ygu2k1h0NClhZk4pLsznmP3mm1mqgI+IZGEmhXm2ImumoEX3ROGRVuGxw4300TuFaTUpzbuiK00FDpGiwXKUAYqNYI8n270dLReUkWeskiGyCwzmGdWG9I8D0YgbdrcEsJlyrv/joieTLa5LwEbUhqN6m+TU4/KD/S3G/0FzKN19w2caBMWm3J/I+SfZUeyCfJVevLI7W58QdwpYriIwvTNANLHEnij8hCNa+lDC1skrBMBgMvAGhjHIKdaAAcV+jGQTAk7NR1vbGxK+Idr/auU2G2Ddpdd5As+qI07LqA== 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=8h2NgxY1el4+lE+4MkN8n9+67HkJr49mkXL3VGCCMPw=; b=ogdOFvdKalW3k5EP07bkPZiQCfLwOaHFPxJ7IpHbHqGY977wejQip5ON634+kcdRgyQXZ+cM+P2UjTayR1V4Fhq3I64m9lIcl7prcYhm2wxOum5AiWL690xBm0a2A8dwXJdeqO0/5k3AbmB42SR3OOHs3hg79V/exTNrv/9HNwwldWkpHcTpuwpk6Iufj96aDluBqqcf7DbVArsZVt3GI8KM8zZ5pNFtRsEMayC1vLMCGt8KWAHNNiMnJHgOrLG+R2IXR3fi0gZvgsgVqEP45G285E+RkYMq1NVjhTwI8M3XC5W+ljxDyzc9flPQiswWd0Z9SG+uJDmRMCNY2JmsMw== 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=8h2NgxY1el4+lE+4MkN8n9+67HkJr49mkXL3VGCCMPw=; b=OaSsk1fkTuMn8YIbLWy85aZmxttUiYzJUUCig2X3YZ1ndFQzGfCQg75DMq9U0ltWUL4u7L+hDlr+8Au5SJ6ZvP5nUNk9EKT2uVS3vstGaaawGs+uFbPWvvKUQ2RJXfW2N21VOf35HFHZFm6Jl3VMFdeotST4boMmxudAqb9yWTJqGbHe72xAH+pFbMqdiv4adrsp4j+m9CXroyOFGltvxb4NUkqgkYqn87EZoF/1I2XLhf6bGx6BnegNRAvnHuAHmKhDhnYnj17lXWmCIqSmzYhKce566Nuj5ASaTkwggewV/yR0K7LH1mTSrNl4mBKNAPbYXMatVMYt+Ve6dvHsng== 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 PH0PR12MB7010.namprd12.prod.outlook.com (2603:10b6:510:21c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Wed, 26 Nov 2025 21:06:25 +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.9366.012; Wed, 26 Nov 2025 21:06:24 +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 v4 1/4] mm/huge_memory: change folio_split_supported() to folio_check_splittable() Date: Wed, 26 Nov 2025 16:06:15 -0500 Message-ID: <20251126210618.1971206-2-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126210618.1971206-1-ziy@nvidia.com> References: <20251126210618.1971206-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR07CA0001.namprd07.prod.outlook.com (2603:10b6:208:1a0::11) 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_|PH0PR12MB7010:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b149225-359e-4a96-23cc-08de2d2fa889 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?9E/mU5eVGKRNzolBO7Gt3fEcbN9ybYfjSt/19OmK2hnd6A1d8Nkl8OmlE6GC?= =?us-ascii?Q?1mMZxKlIMvEMyS2Vw8U1OrZXMwr3KuPrbr5HPnS0Q+CFqX9ydv0BnnEhSsFZ?= =?us-ascii?Q?GSivhsPQkJ+716rjEg3AHFFmoxFyY4UQZwTSZsEn0/awGAW+2A8Go+SfrfNO?= =?us-ascii?Q?v4IIpDqZHH0Er1vJwBd0i/myZNCaOUjMZouCU2o0UGbmZI02PX46lXy9rBDW?= =?us-ascii?Q?ZtTeOgVSJrUSHcoV+aZCjM0CEB65zgJTSLhrFy2QUNvMHKQb88jvN1mddGA1?= =?us-ascii?Q?SWffPGCTMbb9/mDgZti1FSATzaNVS0xSgsFXhg3poWNU7mE4F3xxnzoIuIQg?= =?us-ascii?Q?JVlG/COI/KzBYfOM8Q4zxCUiapgQKrhi8UDx1FOe4fjktlL3iUFG4XxfhuSE?= =?us-ascii?Q?mPp1rKnHrkWU/LivabBT3z03bKUA/uCe0qMC7Zz7b/OmAoEIZcJmxgTvDvdp?= =?us-ascii?Q?CyvAV3JkoFuuFiB2l/eV3wDuOF7Ba146kpOnlXKTvmcHu9L8tf5OI2HaPIDd?= =?us-ascii?Q?hc40KhA+/6f1REGot8jIkRckbh8PmPYqAk/mGxGdX1dAMQyMIe+CZopSVMa5?= =?us-ascii?Q?OZne8aqeAXa3wP/UVzi5RyBy9cB9KBYiQNChxP7v3a2eieYKEl4Qu1kgvReN?= =?us-ascii?Q?KUZFXveORH16x1TwbKw4ScDLcV+DHVTeyb/agS8WaOz/38JA9W3Vpmh7Y3wG?= =?us-ascii?Q?HTI/n2DnmxDSL9blp+qzhaBFSzdEp1G2mF4O2C+Kj+fvx9SzcD93cQNqhUfb?= =?us-ascii?Q?7Wpi+TEUXqnA7V0AZAC3fJU9cHMr+1B/64ABgEJydBg8V93cRvKp8q0tQ3sM?= =?us-ascii?Q?mPTZzdD04o/dK2bUr+TdWwm3hyeoFNgPMssw7dkPDr4q0kYrzSHhgeB2u4vn?= =?us-ascii?Q?zkHpnkrZAUCFR+WRZFgaHXWk+4G+I7VXG75D8BJ59NIkSM+L6okYdtdSq4l8?= =?us-ascii?Q?U3/acdkbc5SM/uplojlwU2an7l/ClH2kJDhoo+tdTh4E0/W7DIFDrDba7Xzl?= =?us-ascii?Q?CGk2gskuSRXge9QH7yNS1ctkDuQGnN+XyHNnDSS2TBCjls1G8cAQ+yPO42q1?= =?us-ascii?Q?qe+ujvwS0fHFJlWL2Sl4mLHC7biHarTOdi73ehQ4N+7vlvj9zZ5rGxrrOG01?= =?us-ascii?Q?PbAd+gTCWfd6zewVNz4eQWWlQKEZIaszNfasEo7gPXWX6Qiin+Y0EKWH6VFy?= =?us-ascii?Q?nliOP2dhaevVGWzTweCgwnEiHj7JgGd2Ol2I1LXTElZu0/fcvdDCkgkUJbfX?= =?us-ascii?Q?Shx0E85mjYr4uUGjk9mORarpnhABI1gKzBbCzPYOQdX/RP+tAOIwY3uCuVyB?= =?us-ascii?Q?CLs6ZRcLw+WFY2/1gZe15oJ9xNSs+gG/0BcPhvVNIthF9A6dsPW4mcogZAfB?= =?us-ascii?Q?zbCvvIcSxPtDz95am77AEr+LfWYrayXGDFMCDy7pzVN20b+BCGOYOtT+Kkl5?= =?us-ascii?Q?vrXS5GEue18ExSEX6LE3wwZxcqmqSMMZ?= 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)(1800799024)(376014)(7416014)(366016)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?PQyHv4jfcEfGmU6ImzjrgnE2/43bKkaVBlgXOc9+yAE/k1nsaGrtMABRgAQN?= =?us-ascii?Q?eyBpdnbUiIoDKutp8jsVOZDJaG9BmXF8qgroKS6rlJrkmWAYhlo4SHn0fzFz?= =?us-ascii?Q?vM65nqLHUlu4PI3QlOFGJ6LKXp0udUFzDAqVV1Z/V3Aqdfn6hsc++jOZuubS?= =?us-ascii?Q?ftefZu5y6TN9ku6jmYSIueo+wHDJv6C3ckAkdtwn+EjYdZ/1ecLPbW5Crnhr?= =?us-ascii?Q?rA4XaCyKoHgDTClkJyI5XMlTXRWcb4fEwP/gRQTg1xApBNH/CGCrWABVj9Rl?= =?us-ascii?Q?ItD8srPsOlgI2XlxVGUs4E1FU10Gdok9LUSzhSRSv63wol6XhMyJsrUb6Vi5?= =?us-ascii?Q?3V7V7vfyWPwm18SD44OtgXWDzArr8dbDhaAmoasJ54WZU0sVJp1l+l+If6CT?= =?us-ascii?Q?oGdzSYuxUZko8rKNIMxX0dKOr4AIZldznCU1PctHQNEPHafVs8RvVak6Kw7p?= =?us-ascii?Q?A4WLTNlVr/wvLbTgQie6UZH73bAPQnx+GNVFKJVM7QK74siRx10/saa3lgy4?= =?us-ascii?Q?Jm4Tukuu7p/gchwm1PKkMuuTknH11qYYYtrJo9lcjJ2nPdmCj4UWr757/oh0?= =?us-ascii?Q?2M3UQYJwS9w4xb8ZfTlg6TaM37mGlqjRR1etBpw2U4VD8zNkJIws5ijQnrd+?= =?us-ascii?Q?pbImlgtfH7cDlcbIG7LI6bwYOCpay8Lgibwmgesxl2h7tAk+B96YafS8wu07?= =?us-ascii?Q?ZNWZS1JTFyYwDUULRS3TPUyuypTupiwDMTjfaHPPTmwvAlMjpx3D9bOgn0a3?= =?us-ascii?Q?LXRE4II1ZuHPDQmJDVFYVi9LfqYKmGDQ6EMSiUPszICmkgJ3lNP5WlviYYFS?= =?us-ascii?Q?WU1kh6HBO/QPX+SfXjbAJvWPEMldWlEq3AUWnTKCgzQIuDxuZc5xu4gWFN7r?= =?us-ascii?Q?FpmyN3j5z74BlqqfV1Ku4zG8BO2KIWQMA0HlJwcXMHkp+oTybOrhOZqI1Ecn?= =?us-ascii?Q?21T28LHKgCvlnFdWW5gul/pVgtfmEzWJ8N9oS0QgCGDwSP80Abx0gT8vHRCt?= =?us-ascii?Q?+OZTp1+utKk7j/KP2t1biq3mDgnEcJL9+LZh4Rr8lXJPdajPt3yuo8h5lW57?= =?us-ascii?Q?gdKVQQxJN9XrYy7XYFPULjezBxXpM9mrruEltv47HkYhzOmm6COnmy7tzJIh?= =?us-ascii?Q?f3rQEiPSlmB01HvhNWCVUZVMfSsmyuT3qJYBlcnyHrYhdiqWoi240KkHFf3s?= =?us-ascii?Q?qgIs8YU5X0W7Glkyab6vSPhpKkW3MDopxrT8u1xPIECND1MPWYF6HndAO7va?= =?us-ascii?Q?r5BWJGkFCcaKCI6UJfT+WlPNvHoGym0f/93nbZCM8FGiwtrDJZbzJWF2Z7kV?= =?us-ascii?Q?k+iOPO7ugjSQonhFQ1Te84HUX/06TvLuyuQLYtqfR2TrOpR2ah3oM6UqKnGY?= =?us-ascii?Q?3AAjH4zOSBapxpu7h5Z8V1QZNIx7Zu575v5H0rBgyp8SqcfLC/LdF+pg9RjA?= =?us-ascii?Q?XjT8Q9fFYo1JlmkYCXMY3PafCPtxDP5AU9ZayPvzUAliXvte4cj0QEupa5Cg?= =?us-ascii?Q?eq9IZTe4unsKYuks3A0hUXcPzaVp+dHVMqDZIr8hvX2qfQj0fHITbQyBftia?= =?us-ascii?Q?G6jYhtJRbGIoYrY1W3VLIe5SykMWNKIX0V/anJSs?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9b149225-359e-4a96-23cc-08de2d2fa889 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 21:06:24.8507 (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: kyZDslfb7c5IamqOCdjjWo/i4a8OvyI2S0pe1KG7BCHthAjvE7l3IfY1SMDstQ+8 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7010 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. Remove all warnings inside folio_check_splittable() and give warnings in __folio_split() instead, so that bool warns parameter can be removed. Signed-off-by: Zi Yan Reviewed-by: Wei Yang Acked-by: Balbir Singh Acked-by: David Hildenbrand (Red Hat) --- include/linux/huge_mm.h | 6 ++-- mm/huge_memory.c | 76 +++++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 1d439de1ca2c..66105a90b4c3 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); int folio_split(struct folio *folio, unsigned int new_order, struct page *= page, struct list_head *list); =20 @@ -407,7 +407,7 @@ 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)) + if (folio_check_splittable(folio, new_order, SPLIT_TYPE_NON_UNIFORM)) 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..8c2516ac9ce7 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3688,15 +3688,40 @@ 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 + * + * 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) { + 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 folios without a mapping in the + * swapcache (shmem or to-be-anon folios). + */ + if (!folio->mapping && !folio_test_anon(folio)) + 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)) { @@ -3717,9 +3742,7 @@ bool folio_split_supported(struct folio *folio, unsig= ned int new_order, * case, the mapping does not actually support large * folios properly. */ - VM_WARN_ONCE(warns, - "Cannot split file folio to non-0 order"); - return false; + return -EINVAL; } } =20 @@ -3732,12 +3755,16 @@ bool folio_split_supported(struct folio *folio, uns= igned int new_order, * here. */ 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)) + 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 +3949,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,31 +3956,15 @@ 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; + ret =3D folio_check_splittable(folio, new_order, split_type); + if (ret) { + VM_WARN_ONCE(ret =3D=3D -EINVAL, "Tried to split an unsplittable folio"); + return ret; } =20 - if (folio_test_writeback(folio)) - return -EBUSY; - if (is_anon) { /* * The caller does not necessarily hold an mmap_lock that would --=20 2.51.0 From nobody Mon Dec 1 22:36:47 2025 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011070.outbound.protection.outlook.com [52.101.62.70]) (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 9A50A225788 for ; Wed, 26 Nov 2025 21:06:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191192; cv=fail; b=Rj4VTxj75APTcZ6r6GUVEXJBB1zuFacrPuQsMuegkFZ7MqM1FXsupyz3L6vvVAQ2xAxDCD/TqDn04czsHSut+CcJ3v04OY9jINbP2Vme4BJosVj1t/WvLkrFWGmGGZhr7VKHdXuX460ueBApZl30S6KH02ULzyci5jlOV1RqCEo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191192; c=relaxed/simple; bh=B/g98wAeVGVPhNOJEv8vvTVCPpzbDktz316+CfOU9nQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=hQDCrhO3fISecTUG3XQ8JIDnYzPqJHmm80Jb7QjM/fpcsMMhUdtUUv3OJlJeJAwgOQDAiIVSLWRMkBsZcioMwttor+AmHd4MdYc08HoMomVPjs4t+IZwRUsWOktLOl6BXJ9/N6iQol3XcI5C5OziXhrwVCVPVgMnadTGJZd9sWw= 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=QU/RwDPe; arc=fail smtp.client-ip=52.101.62.70 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="QU/RwDPe" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mZQ9mq1QjJND5M9oHNVMjRo7v49RJZHGYkJq7xlJajrPvQ/7sj7iOGnBSrCJi5JnxGxS2g0qHxyGpx7L49Yh0M1FLv+Hui5SHpdpym1ftY5RzgxzjD4Ia5COJET3iwrxI6ElU/SPFYwBjPgXyOqx+YXGeZpghG6u9P/0TZVo7AQQzw9fcf4BAtrWwg3gCDgl4QnZIji8SBRm0bBW1w0Y63zrusto2M1B/ZM78npNdVPtb1NnPYy+T6C2Uyx/BCynOyJ1CEFx/qI6cQV/lH00IuS5luMgLXv/uFyqRzXPGbwXDHx4wvBYiJ9djWDYCOSEUg0BvpRtrbyN2I06tojH6A== 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=JmYDoJ/TfaNmO6V4XeGzkbZgXkRGmkXlzitbV4Trdok=; b=VxkBO5xde1qVXFVJe3Bg3X31oq6bdb8hKt+aGXZPybYczcG9lnaoCj3z3CQUZN6W6XDLrLv9Y0lyM7qkxRZW+nXIc7rzy7hn765GnDxuHWn/6cCrFM8Bw0mIgoqCUuiu+dVC59jTHdAQPNGTXInPUcBAWEwfWM8nJj0pnxZqisoOp+KzmOnna/krH7qazRfNSjZcKlJe8vnhrJmCjG7rS5nvKo60mK5vgFwNskl3dx6Y83xZt5B03tfwn4ONc+PVfrI9ZHNI5GKJfkhbiYb2jFV8TI33WtArU5O1mlluAE+IPHAZ5/MgXj7NK2BvovMHC822WKeby2e5cnuexFIn+Q== 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=JmYDoJ/TfaNmO6V4XeGzkbZgXkRGmkXlzitbV4Trdok=; b=QU/RwDPeh7w5VdKyl6Ehl3nFZHNB2Pp5xSqZNAJrC6Db8pbPfNWOhFolXKxIbnSjJCC1Qo9f7Bzo0kr4W8MUKoA587MB7pFzMeLM4jeB9m9zXfhWdde5ndNVjqyiG4uTeiv+dp0J4M3OvsRoCL2UT+rBertZvYfWvy4L3/pNsPuOAZNomvsD0LwSoQUf/4gQRbT0s322a7AJQ/2LijnxJkBAM1BnTfWmUqcsg3ki74wTd+zsLNQ3B7ktdZuwa7aieEQWu+OgP4qdLuYLmE+X7iTgQYK2cx7u+lM285lsvWLASwFAniZzbHJw103UCJH6+XXyXw7e4TabSLz3AmVJOQ== 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 PH0PR12MB7010.namprd12.prod.outlook.com (2603:10b6:510:21c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Wed, 26 Nov 2025 21:06:26 +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.9366.012; Wed, 26 Nov 2025 21:06:26 +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 v4 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation Date: Wed, 26 Nov 2025 16:06:16 -0500 Message-ID: <20251126210618.1971206-3-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126210618.1971206-1-ziy@nvidia.com> References: <20251126210618.1971206-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR07CA0005.namprd07.prod.outlook.com (2603:10b6:208:1a0::15) 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_|PH0PR12MB7010:EE_ X-MS-Office365-Filtering-Correlation-Id: d1fb6d7f-5eb5-473f-3017-08de2d2fa98d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?fiR2jOF7DjC0gepzfR25SHTYaezMq0FkdQiweB0/Norihn9wvI3+S9MKg6kX?= =?us-ascii?Q?KQf+mp2QzH6YYHZQgcWkKRCGAH19zIZuYdSUmk9grggqmpWJHWeHcx6Ycu9g?= =?us-ascii?Q?UEcHTVN9UqmBd9U3eqsOkUPIOaoZ/J8641VNyNnbySQS2q78LXq2XPHGwoZL?= =?us-ascii?Q?q8X1pR+dcEjLjulX1q03o56fk6TL6+dRPzj45Mj0ufbwmzNuVLHa3y/Qwtsj?= =?us-ascii?Q?LZ1i3grzWVXPLNYJCDfOvsjwku7t+3j/9jOmWNf4PO6UehNeRzZDwBsDr7xa?= =?us-ascii?Q?IxS/b+o3tOdWHE8eWOG4UtVNf9/mxD4PxrfCoZqMvT7mfj/WdmAhd8HtMfqJ?= =?us-ascii?Q?P2F1jf5E8Wjk4K1wOOemdK+XpmyZpmBJRzcB03CRHr6w1J/qNyX0vF9gL1EH?= =?us-ascii?Q?on0i+m/7IsXTL8ZskQgw5gsI3t4xgAI0s6SHV2NMaUJqEUnAb0gLqH0KSG/U?= =?us-ascii?Q?i3j2VrDpmLMsx3CvIrgFMh92IyClPdPEBow37kYTzhYvJhOWOxfj/scpcycK?= =?us-ascii?Q?xZvMxHbgb7O1R7jiHTwIxLYalK2N0ou1hoCh+l23QYaARNItVbD6MguJmzO7?= =?us-ascii?Q?0ZWLMSBiwyhw4/CgaRQZM0N8Md0Xrag3y4pZ3kBbAAvpWJP7k5qqDsMv3VIL?= =?us-ascii?Q?ceDBHmnjDs2AudOfYYGX4RvwRWraqn6xb/AilW2zCmMFpOmNF0lCCry6grld?= =?us-ascii?Q?GGWkV99uY2VAhCYdXrAcSnuS0vXgFfikX8fMOXhmra7XIZwjbQRnLptX46En?= =?us-ascii?Q?Ei1s+TZcU/8LGxg2sKIry2TTTbyqAhW9tE2lConKdX56up20YjvOJLgi7Dye?= =?us-ascii?Q?UI6rRSIqmpLjBEnLejmakHfSjUgR5Z41EXxCk3pvnSIM30i2F7/sEePW9qFJ?= =?us-ascii?Q?5i14uzf/bfnxuHL8D9Gk/IfXkH2kmUhjqlVjouiEw2Ajok7buD4BocHRpBXF?= =?us-ascii?Q?4xF8hHxV3dm3Xtf5GBZkaczQIKWfQKe1HgLhLULrefNLUjqzhEeEAKQjdriE?= =?us-ascii?Q?clgXdEoiPrEagwrBHdCBdXxiS7/DA5L5cI0AWkS6v3XSXKbBg6djQf9VCW7S?= =?us-ascii?Q?rooHX8QQlAY/fyduwvSCEoNI7RqmvyiUsWvfotNoRLYJmfl6R47yb7eDq2Nz?= =?us-ascii?Q?XMy7A9Ait7HdfkUpWBj9ec/h5unOmbFEsiZdvXDhFhERzzjkPImd9oLZpULN?= =?us-ascii?Q?wtuoaaGkLOPV6mW2IGQAzL3f/31B4VCzmGmz7w8HREz+gSuILDSfqJUk/0Zs?= =?us-ascii?Q?4hageRVKA3gSS8muj+PHXg7oN+kf+eZ6judE1R5b9U2HXs2oA+btu3EXgOZD?= =?us-ascii?Q?QxFFtTE26ZG1Roz9b9gP+i3Qhdy2I9Xqfpb++lp5iIhZzDmQ7ODxRHY7IUzg?= =?us-ascii?Q?E0FcpilwZpVBG/S1Ajq2A9Y5mv4in9y0hhQ4mKvNUoNFP0rdpOwHEaxqBwJD?= =?us-ascii?Q?qj8EJfsduNKlgP8nKkDhshwaS8WSWabb?= 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)(1800799024)(376014)(7416014)(366016)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5kDCjOn5Pilj/wFuBHZePULFYDbu5hgizcG9O+DHXDGW6vQVHqsM6FVCCb9i?= =?us-ascii?Q?K1HAvRwPmisd/+VNbQXv7DIzYCui2TQQik2vPtd0XVxP12AljFsFdBhATikS?= =?us-ascii?Q?omAJw3cZ9wUD7rqXevDhSy56JiwSPgu5+l4i0z5bJcaR074vmz+knJsCHvvw?= =?us-ascii?Q?8reJFOVkXQAaCNmq9N+0QtbxqYasbkdNSMXXd5uKn/cHstcR7oqDkIXI/9Rv?= =?us-ascii?Q?5IzemXVcjxK3cG8iuOyaAkk3t/3PS5M76CsxL9/HXwgrXN1cqWz5ZY/N9cpB?= =?us-ascii?Q?itgw30j4TYK3AVUWY1b1fpbDtG4VeQvN9In3xtBGkCmr6iKM7FlIyU9Aopu2?= =?us-ascii?Q?U7bey8K9zU2eZvFAr7hktnjiAlm3b4nxh093d5odL3PakBFjOvQiS4XVK9QI?= =?us-ascii?Q?UnW6Qg1Y9nbw+myqTemyDq32pUXtNWTu7JfDMSPA3grQ/NG+cap1bbNWbgIe?= =?us-ascii?Q?m1MK/9L8U6/vta8NWDbgblovw4UA9ifl8+elCpllbpNFS9tMbbabUK2jQMOh?= =?us-ascii?Q?cqahulZIxCZrJmYrmkJccWYzAPRGSXMJXNQMh3kTCVvYEu9o3ujycTl3uCF8?= =?us-ascii?Q?9cDEKAASAjaPnfS+yYq0rNIwH/elO6TKWaYrkJs4M52/uHlHQm8qJB30r2l2?= =?us-ascii?Q?z34gLyjRsUcAA5MeP46n0WfpYCgWUB559gaxE3x3RFq/LkgzZ21RPyEaslxJ?= =?us-ascii?Q?WqcZoq6b4QUsSQbJ8KGPbtDqDCXmzrHPn242gRzNbFTXIzWi96f0Cpe8pt7y?= =?us-ascii?Q?a3g43rBAEXRoSTcIFxB9anwKMRw1z5eVnu4DHLWbwS3haB4McKfjStbIksAK?= =?us-ascii?Q?seIhqpq5s546PsyA87tWeQNKc+IdJXCPrmF7PaZ2TDF7JM1k2hkgf3OK1ttk?= =?us-ascii?Q?ZS7Upr6bhd4jJATs1buXQuXU7t45qitXLHPM1lEwaYUuorp/mO6g6rxwEFCu?= =?us-ascii?Q?ufNQ+f87VA1j6NAPYfh7/14EV/VxZMyzQGQfdHd4l54NBAjsOV6bA85nkcRK?= =?us-ascii?Q?HGRhAiln/hOaXCbuyJCpPrBodNJPAiPdMI/f1qIBsMJLifcFfpetwg7xsnWw?= =?us-ascii?Q?xe3zF6i/SUYab+SAIg93ymWWmviGLH71w25JHK8bfl/hY5o3ubHeKCe9xjwb?= =?us-ascii?Q?ws+qHyiDHo8V2VqVlypCHE+iudlqjCB7Y3YEW0h8464ZXlrZteHBOHVNT4do?= =?us-ascii?Q?JN5jv6R4daoDlMWjMb844DiqCObcUkSo5bXUqJDiSuGeNqpBcaEPa3axIMb7?= =?us-ascii?Q?rAjJl0D/hjeTpehopoCQzXszVsI+iq0ljUC0acgVpMyI69d56SpzEgoJRxWt?= =?us-ascii?Q?3lOdjmwGbeGTTjZh8THV2Vqa2Ida9V/Z0Eg5sMuzdk0cqTxIsukTKB4mD+dm?= =?us-ascii?Q?tIdhPwCakXggYETAWb/ZUmvca0yEe4FtZMGL4cAhryFA7DZy5cJkr1/q7j3q?= =?us-ascii?Q?WbZwyDVoPqdw0gGMDFjgSWcn30QkupEF66JKRi0r9wB44EJujVZ5ljgIkAsf?= =?us-ascii?Q?lRZkOJnbSXqkw6H4sYI/eok05h1Mg1ZH3p8mbXIVcuQoEQ7ZBCjE85UYFBky?= =?us-ascii?Q?y0RF8jSYQXq8hlmYQi7TzogKg1mRk2zv7CWVl5xR?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d1fb6d7f-5eb5-473f-3017-08de2d2fa98d X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 21:06:26.5763 (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: n6aBf5l9m2gJD2if7YAHkzSn30RMsshJcZDImf7g9PKtpq+9zi7Iz4gH7O3htQVZ X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7010 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_ref_count() to calculate it. Also replace folio_expected_ref_count() with folio_cache_ref_count() used by folio_ref_unfreeze(), since they are returning the same values when a folio is frozen and folio_cache_ref_count() does not have unnecessary folio_mapcount() in its implementation. Suggested-by: David Hildenbrand (Red Hat) Signed-off-by: Zi Yan Reviewed-by: Wei Yang Acked-by: David Hildenbrand (Red Hat) --- include/linux/huge_mm.h | 1 - mm/huge_memory.c | 52 ++++++++++++++++------------------------- mm/vmscan.c | 3 ++- 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 66105a90b4c3..8a52e20387b0 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 8c2516ac9ce7..5ce00d53b19e 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--) @@ -3767,11 +3750,19 @@ 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_ref_count(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; @@ -3782,10 +3773,9 @@ static int __folio_freeze_and_split_unmapped(struct = folio *folio, unsigned int n VM_WARN_ON_ONCE(!mapping && end); /* Prevent deferred_split_scan() touching ->_refcount */ ds_queue =3D folio_split_queue_lock(folio); - if (folio_ref_freeze(folio, 1 + extra_pins)) { + if (folio_ref_freeze(folio, folio_cache_ref_count(folio) + 1)) { struct swap_cluster_info *ci =3D NULL; struct lruvec *lruvec; - int expected_refs; =20 if (old_order > 1) { if (!list_empty(&folio->_deferred_list)) { @@ -3853,8 +3843,8 @@ static int __folio_freeze_and_split_unmapped(struct f= olio *folio, unsigned int n =20 zone_device_private_split_cb(folio, new_folio); =20 - expected_refs =3D folio_expected_ref_count(new_folio) + 1; - folio_ref_unfreeze(new_folio, expected_refs); + folio_ref_unfreeze(new_folio, + folio_cache_ref_count(new_folio) + 1); =20 if (do_lru) lru_add_split_folio(folio, new_folio, lruvec, list); @@ -3897,8 +3887,7 @@ static int __folio_freeze_and_split_unmapped(struct f= olio *folio, unsigned int n * Otherwise, a parallel folio_try_get() can grab @folio * and its caller can see stale page cache entries. */ - expected_refs =3D folio_expected_ref_count(folio) + 1; - folio_ref_unfreeze(folio, expected_refs); + folio_ref_unfreeze(folio, folio_cache_ref_count(folio) + 1); =20 if (do_lru) unlock_page_lruvec(lruvec); @@ -3947,7 +3936,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); @@ -4028,7 +4017,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; } @@ -4051,8 +4040,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); @@ -4126,20 +4114,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; } @@ -4632,7 +4620,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 Mon Dec 1 22:36:47 2025 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011070.outbound.protection.outlook.com [52.101.62.70]) (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 85FDA307AC6 for ; Wed, 26 Nov 2025 21:06:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191194; cv=fail; b=f5S1FqB0CW8Y4N1SnGgfwYYytqTtdXP9MPEkLghxVz0bplWbpNVtWqRIoZW3M1kik1E+doNlXgXbgDZXqor6GwiymCvXq/rH4aViDj7ALwlIYEF8vEDeqhx2ABI3GmRb/4SZIsi46XdxyzoqpAlRQ5FzCS+3vLOtGZZOOj0STcM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191194; c=relaxed/simple; bh=BBuHTY0KUHpI6mC25H4i6b74owfqlbvFZuQ6AkU8J7g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=AaprF7VO4Nlc3jS4C2KloV1c4yi3Y+TmELVcGW1FOBAvnqZX/uCJIbtSdHDW2yjNNKe++BAghno1HGALCB1e1giL7SVPyyEHYtrdlwAcwVXESRGdUJY4Dfh5nBg6ct/zBTbWzMmU3yu8VmgudKQWPlEF5Iebhc9q4XhdhCdWRuk= 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=Il2jdW2b; arc=fail smtp.client-ip=52.101.62.70 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="Il2jdW2b" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=prjFzoTcCjtpLguDbQDujjjrdJdmNDpZO4YFNzrt3mIwwCeyIbzJjaCl3WxO4a6g+S4Ld6PKNac5aOAWAhVfRjNu0AKP3s0KROVMP8eVY4FQ3ZW7iddYbePro43uhSIHYwWvIqWJ0XBOQ7nRqv84rJDbN3i+PMzlD1SBrU3Epy9EFQ/PnofwrklCR44AfQBb3gUvdTA+DeZWqBmifrsXr+q3VnTLgcfiuy0cVXNxy9G4BZIX1ZABx1ljXS+RPLhAZDkXVqGAEWOabz1rTbpnxg7+2bajxV2LkfiZgFK1KKxJebgaBJFT9l/oZ2uU+m0iGvlMhGl7ZwHvoRMRwMLiPQ== 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=YTKg1+bQk3tYAjdwC7wGNU1XeyS3eOeggIK46gauGys=; b=grzv9wWxpmwSMKHkVH0vu2zyierVs1JlHj4oIksHJUeG89xd7m4VHltj5/LoG2bnLS1FG1ghqi0JtJ7e24s0ti994BJ7sJQ89wA3npnheVU8XOMImUcyw8oCdeITJMSNZvNv11PQ+2VTCIp8iNAKku01Gk1EV+8rDs6ild08PTuOeWsjfzLKJTh3MTmapV27NmjsfNFv4KIwa7w6zHCkj1REfsoBKmQvxhu3siDKM6AhoR2Wo2oAmmLQ6Hj252YbyHGhYoTpPmpb4rLrF1gVYWcjyLqtsD4LQaC+YQoUrsToTkIHBl3Zj354MG20lUJOcgFhhRDxmzX3RQk65EqleA== 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=YTKg1+bQk3tYAjdwC7wGNU1XeyS3eOeggIK46gauGys=; b=Il2jdW2bMCGf1aV+WHp1n+mm335eUrQP25Hh400oXZhmIe9qmffa+rIK7C+XZXSfpqfurFBCffHjh8Rdl+VdpEyN6g8lTw6ogDhtRF64BE8izru4ATqZU3wipkAUWgBCb6htMN9vtXcs0kg9BNsbkL/OCh7e3Tc1xvK/GCyKZVvOvEIYnRWsKx5ayOd3teNuYB7iiMdnLcsJdkBI9Lv7sPRuEP6T8ws7S10sHTVSFyRgiAlcYmjIxEozx6hbMvtNjILg8cjPWJlJT6s7H1Ab1/0o90Xzk6DlYCO+cauKeuVxcFN4lP9nFdlHAQZmHivGHxxM1BWhsECyLsI7gX9uqw== 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 PH0PR12MB7010.namprd12.prod.outlook.com (2603:10b6:510:21c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Wed, 26 Nov 2025 21:06:27 +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.9366.012; Wed, 26 Nov 2025 21:06:27 +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 v4 3/4] mm/huge_memory: make min_order_for_split() always return an order Date: Wed, 26 Nov 2025 16:06:17 -0500 Message-ID: <20251126210618.1971206-4-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126210618.1971206-1-ziy@nvidia.com> References: <20251126210618.1971206-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BLAPR03CA0176.namprd03.prod.outlook.com (2603:10b6:208:32f::26) 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_|PH0PR12MB7010:EE_ X-MS-Office365-Filtering-Correlation-Id: af698b90-f809-48e7-f32b-08de2d2faa45 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?OqT1EZJD5r78CiRmM00LDR8TosyAb8zsUJt4pTOUru9tdZ/H9y3utJ1HCq9Y?= =?us-ascii?Q?rF961y3dsi79CgEV7Xoh5GbZRPB0tCbKCjxpVf3nD+HQocB41Sd/ICO02FOB?= =?us-ascii?Q?WUClXE3rQNnpsFkNj8ZEnn5d+yRT8o5LFlyBKlPnengXI9V7VffkoG4cH2Iy?= =?us-ascii?Q?WNb0VwGe12cuXciSdyn6DgzVmGyhBuun6SunMIQE55gwZ4kTjA42Qd8688PC?= =?us-ascii?Q?gVZYOFRR9RHaBTbePbakDDm7+ztLuiuAlYCdnJDvKZWbpJ2H7XpeBI7Ctqsy?= =?us-ascii?Q?aljYnaLfFAOJY4GEMsl3xmxRNrJD/4tOqceSiwn3YsaCtxgP9n+z91rHkV4y?= =?us-ascii?Q?NLxfF6xeboDUokFkXvfmw9qhhy5ZKW3aZt+GKrqtFzJqdAy0F8poJTpCaRgA?= =?us-ascii?Q?bdKOhFs2D15mZF9gZ17psSgLflYdOp7QbA8XADbnwLXPZz7qX1euPNUKfy1g?= =?us-ascii?Q?fVexeaakM3r2FKXQOt+hii39P1+7/y2B8bBx+33F+mmabS9qcoVd3QSIKYis?= =?us-ascii?Q?AsruOb4YuBxiHCdD/x5/LMsq25MCULiC+6euVnagv21UGAahoqVHt4sMnVNX?= =?us-ascii?Q?+ylYMU7mJJz2Nb5eYOIuuhOl5G0L9Or8dtT04ykfVF6uPEMbqWYmuH5STS1Z?= =?us-ascii?Q?WiEdxnbMmXJI8ge5me8DnPTHL1vGILulBXzW4vCSWVtEul1H8v1kX6w4+/Ii?= =?us-ascii?Q?UV6XO+uFZ5dU4sYspEtDbji+1jw21QG5XftWh4NaEZzWYvEXtLFqlm1GLAUN?= =?us-ascii?Q?j7f/cvhYhvudiGKDvm7T+rSiPUMh3V0Q5dhZECpsviqt7/guE52vCC31fTVV?= =?us-ascii?Q?IGNOQkzrMT39KfPFvpweOPHaHeURbSlk4y0g10HkDolWuRToWlN0CDGr4QnA?= =?us-ascii?Q?o3Ie3dbBm+0kLqr+Lq2F6nwg/zJeFKGJN5Ylw5x/VwIfggE+liMm4ZnM/zfY?= =?us-ascii?Q?aZJMg3bsuQoROuegOY2BYNilGjHIHsZeLlRQUAS1qH4lh+k89us01UHgikp/?= =?us-ascii?Q?kTup4pSiO0s7V7LWUfIHGujX/iRLectneSRdEJMknSkuTgg+HLkh8TAU9sHa?= =?us-ascii?Q?9FvnowjsFtoRyK4x111MUJoIkKuewBl+qWz9IbM4q/ODDmzab5poxBcPZkpV?= =?us-ascii?Q?F452uIUBk2KqHm4aMpyJQ50igpq8CntivL0MWyNJbsJXrmbATxbLzwbGIgJL?= =?us-ascii?Q?Qkc1TKGeqJLINk4r3GlfYWI1PZXgIGqTFQIJX5bm/mEYz9kCQTiyUFxTyjUA?= =?us-ascii?Q?Tz4h0Npcfmi0NBCWUBcUbf2DFrhmknXKSCXQRjTt2+AfsB6eSLEC1L366FUm?= =?us-ascii?Q?l+7j0gPQYtXYHKWm7dxil5CeCogvWDNDk5q30c0jhUPMJelBKA/2NcOuluS/?= =?us-ascii?Q?Jr95QCHf0XhlLyatDoWj/+sF+CY6gY7uq2HJec/qKY2ojOfFTF7HwRNTyC3z?= =?us-ascii?Q?YuYWLZ3RX69b9JzpsexJqElnXSocvSeG?= 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)(1800799024)(376014)(7416014)(366016)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GUcGKz5M2MN1iSvUUMXVjBhEMpmG0C8r3S1qW/lBgh6y+TgNrFdCuPg+l4SM?= =?us-ascii?Q?MNBiw8dZCZXsAxvGlrDz7/izmvU/DvzV0OluseUoPqmS21mN/zIVC3owHe9b?= =?us-ascii?Q?0Yu7T4MBJLwOE4WNkQJxyELIus2q/22hrrO1n1VVKUJpm6ZXpys5yuzzaW71?= =?us-ascii?Q?JvyjgFDpSQq45zGh/+VlP4KiNkPicnuka9dyKQYgLrV6i4dyqITaaJ94rRGY?= =?us-ascii?Q?2/Uuf5O0+DC7tPcZJdNEycPFgI3CUGF8Pm2IgwiHWKTAy5H9C+BQvxpWRxns?= =?us-ascii?Q?Zl2EOmAIJlh2O46///RcmZ/vtmn2AzckAlt1WZD7b95wQDwN29SHBoakTIcn?= =?us-ascii?Q?JJfvBDdHDIi9NRa57uwiMv1a4CtVsq6QjUcyNeQS3UAL3hSrj2bC0CGr3wNt?= =?us-ascii?Q?bNZRzgrZEMWEskm3X7X3SmIF7/BDNprvtUOXQLGOH5+FSog7JKYud6GYvu56?= =?us-ascii?Q?8JbIIHODNjL+p53PXSWA9VX7fC44vuq6mRJ0Rck5nrakCeIUtMBSPMHsfL6q?= =?us-ascii?Q?hf5JfzcKOGPm9o4T0Wi9ud8Jh24jvB9t1vK46RowgcmLBiC9awAw0qrXtZ51?= =?us-ascii?Q?zw70YAR7+23zrSL6dvwyw8uWy4YA9oWQYDIt9Of2okIp/pcw+iDOebh1NBkQ?= =?us-ascii?Q?wJhI8mrVygCUcwuCCcqSsK3mf1wCLJn9v0EI6Yzh3JE+MoxraZB8ExrJ7Bwk?= =?us-ascii?Q?0haDvjhly91XX74EaqGuZ9qJhlIilCN0I5YLpXRFYhj87mogk9JQ6hdEpAe1?= =?us-ascii?Q?GgMQ4p66KvaQ0H5Q7VgvKlC06FuAr3pH2P8xIO3Aol/bzzDadJfkdDVD76/3?= =?us-ascii?Q?jeD9eLfl7wrF5I8GXHBho5UT6k3Bnz0BXxnvY3HJdMk/w7HisZCdxZW/IutO?= =?us-ascii?Q?EQGVByBUilzk4XHMCjdRPNbcnQZQ9UCXUa+VxVQ7tkN4bEK28e+74CNnw7/b?= =?us-ascii?Q?jwA+CEvck5+UiplK7xil4mkATnUfuPugngavIWQaVBgYdRCrtyC+tPc5trQ8?= =?us-ascii?Q?vXeDKo5eI1r4f7jiVBlRIbSThxe1mVnCqnWdIN3683lkS5zCJdzk8cXZ5wJ5?= =?us-ascii?Q?Adw0aY55AcCBC1Rsxz/iEXW09smJWqH7IO7sAKq6aYX8c1G1Mf2Zv6j4bVv2?= =?us-ascii?Q?9MJbv4Q0s4Ygd5yko+9VR8sL5iRYB0iNR/l+FuPJitOtQ+X9mhxx8Iwk1D7y?= =?us-ascii?Q?nKoRDiJ11mFjLSfNViMp7vnuKmWw1EMUB/uKzYovO99tCVRaOniZOUqkH4ED?= =?us-ascii?Q?vuOg5tslOCqhMm07EUOPX51bGEkJlHzKAJqAdlXeoTZEjblq9gR1wRl4dmMd?= =?us-ascii?Q?UgAJHTCGsYdRLQebD3vFFgTg9xC3NtgJL8pRoKx7nfOH3vXyZwyyPLY/Rt4f?= =?us-ascii?Q?mBRKmx48+P7ZtXKdpWoY3ASK6adSqJpaqv13E3PuARdzgQSAMMsUb5msnnEK?= =?us-ascii?Q?yCyIg/b+TG07jk+B8o/NRGahZNM6UftMq/Jp5aBNwSyzunQg76I6pJR7/xBj?= =?us-ascii?Q?shHP/ZFknuf5pPIrjzi3ICDP4cDUXEESMrPFiQixPGKrH5dVlupdlqgEkXYI?= =?us-ascii?Q?AFvaZBoBcJLCIx5uWDRVWzL/Pi20pZr/qkEdlx6E?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: af698b90-f809-48e7-f32b-08de2d2faa45 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 21:06:27.7756 (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: +immZI3PFYakdMY1nEfmArzFG928gCf+63iwVSr9P1DuOYx0w5G29MQ4OJkBzNBf X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7010 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 Reviewed-by: Wei Yang Acked-by: David Hildenbrand (Red Hat) Reviewed-by: Lorenzo Stoakes --- 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 8a52e20387b0..21162493a0a0 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); @@ -630,10 +630,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 5ce00d53b19e..1a3273491cc5 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -4219,16 +4219,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 Mon Dec 1 22:36:47 2025 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011070.outbound.protection.outlook.com [52.101.62.70]) (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 96DD63191D4 for ; Wed, 26 Nov 2025 21:06:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191196; cv=fail; b=iurKuMCxUzaxUla+V8laBORB2A80Vd7HyYk/Gmqhxk2t2gM00TXTNvuJCA9748m//7sbR6TmR2CsYGI67qlGFZnFUXemTMtxSdlaKe0PuR2tD9s4ISi/DK8sXXpNkYF8tRTt2jH7J+2lg3ivNSna28nM9EtQhGgqoFzbECMpIoQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764191196; c=relaxed/simple; bh=nunJpSnu32mVmo5SS3DVbtCldhixxAau11YWdqy91n0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=peHATcXz6f479Fu2EW9TKYZuJnLNJaVaAJY87DNoctRta4GJu1SX+pxDleEDGJOFwmVs1HkHvsAmiuqdZl8+ZwtvYsyyToCLC+cF2Hy6a7m9M0zcu6Z9KaFBLl1DsWLZlJm7MClgNtKotldh5wsjMbsQAoTlmAkEBk1GSp6aCy4= 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=jpjMDvH4; arc=fail smtp.client-ip=52.101.62.70 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="jpjMDvH4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IZqjCfknnkQGRhzSdj7XUBh7grjmxSvojbcpfRiDu3XnQOeUx0C+Lk8QL4oG1gaspWHI8oR5aEiJaIuDnTsdHnQWkdwzLX6zHH2cNpiPXgTSMC07eTtDjXHAcNmJFQPVzibXfJnUQIUMBenZ6seP1UALDIWTUf8OKAE7HXottLXprNo+Bfke9XUboPXH76nBpWaPd0gEKsMf4KfuauoFeBL7wMDXIvGBFablAIS7bC/9yGBt/f8u/kd2JzZLJSZQJNv2QnqpUNoI2h/qjhoQfqH3QIoAkOh4SO8UB3kX0nsN/DaPUEzQL8gQhX7xp+GcHogHeulTIv8TZuFCEmw4Mg== 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=uDQs/kh9JUtHJ022231hR86fq9BhgWuffoit9U+1T/0=; b=yXuhVwyE3fqvIFF4T9GfvsKuwGh898zKWyvUYAqur7oKikImvapPlQG/9ltGjN/GRVU13JFUqMoPI+kMwycaXd6wAjoDq6ZvEdkug9YdE8vV9PzAby0d7GXiqUHlTIOPrnxxioywxY6KpgvyBB2kGmg91IJKayL9f1QozDdZ927Z2OZvyAtG2+o6G4zV42WmAopwS0e/XI1yrRkfHaG8wsw7r5ZHcnv3FltEBEbwr0ftEbSi41q6QhY4hgQls6QJypINIv9PlMw92NNyCX/h3G6av52u6guGVq2l9Vx2JtWBWSCcTAiaoHVGp5gPxcHIFaQmPNt2nuWYkoWOID4GtQ== 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=uDQs/kh9JUtHJ022231hR86fq9BhgWuffoit9U+1T/0=; b=jpjMDvH4aK5EzXtAd0nVAKWF+Lt0YqR+czdOr77scz3t7SbXGb4BAbvlm3FcJ6/Dquh3Hffsyo0HQJ45tM9oAe2OTUHr4XwmOpJ+GyYGaJqnMa2gkCLnwunDuf9aP18oX9WXW2wxYJkg5SvZSbsc72Qx+Quxi3qOKzTw3TZvXIG0TO9S5FYGzF3o0Fz6v/S95O1gqkakypvIHVz9OJZSGNI0aOp8sS4/2bLBeF1u3pKTa3n84/XhRTE/zmAqe6ZeWC6P71MztM4KeohcShkiqsbEy5oOTjUFi6+7ZHffGyATDn2AuXB8UNY//xiaywgJ1SjB3r755CMsXRe0k3r/eA== 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 PH0PR12MB7010.namprd12.prod.outlook.com (2603:10b6:510:21c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Wed, 26 Nov 2025 21:06:29 +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.9366.012; Wed, 26 Nov 2025 21:06:29 +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 v4 4/4] mm/huge_memory: fix folio split stats counting Date: Wed, 26 Nov 2025 16:06:18 -0500 Message-ID: <20251126210618.1971206-5-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126210618.1971206-1-ziy@nvidia.com> References: <20251126210618.1971206-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BLAPR03CA0159.namprd03.prod.outlook.com (2603:10b6:208:32f::34) 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_|PH0PR12MB7010:EE_ X-MS-Office365-Filtering-Correlation-Id: e1bb37e5-739d-4cbe-7742-08de2d2fab18 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?DhNqHGZDhuYN7pUIH7fKbCPuPzVEr4cbV/BaRB69qyWMoFrGH9POoJ9DYtte?= =?us-ascii?Q?Cp/FKCMz/nAYeXzH3jf2DmruaVRCWuDorWlrYIHttJKUj9IPHhH1DuPpjTCO?= =?us-ascii?Q?NYOJ3vCDcqkeGit9PtjexH2B1K/vkVKejjEffMu+t5c0nlOJnJyPgBHBXqOX?= =?us-ascii?Q?Drr2YZ4KHp+pDi5AJjjg8oPYrIlBju9ItoRCx4Hpnf8Zv3HTNmSlOvBoUcYf?= =?us-ascii?Q?LY8aKXeLYfDEUiDn1Q8KMpaPpiPBe1NIu/AETTX0fNJ6Y1GDEuUFjTLg44yo?= =?us-ascii?Q?AMnkVbeC1T1rbUjUdh5nknhS3q6KNo+ncPsvfnjAV8jqE9OYcFR7HjlU5BoG?= =?us-ascii?Q?1fyzcv+mxjrcon6dcwAXTisD8S1XAPyHiy4fs44sTQ6vZwhb8Nt/Vtz5f9JF?= =?us-ascii?Q?/XjOLc417cFkOrQ7t+eWGygNpVyxTF+8UU+4AFCVLJp142WpIxTAXafGFg0H?= =?us-ascii?Q?VMLDM25FWThnX6DzjZJFN4FfYggjxeAG6QZYYN3BHEPpG0XqI49G9nyIud+v?= =?us-ascii?Q?5eO+rz6tgtQV8ax2s+wuffHt6yg8F247v2UrIKGs4qU5+KtTDsLkeeX49njT?= =?us-ascii?Q?VMqUa9eS/e8nl6dlIzqxS5bPFGqIFXwDYdNBS2XQeOURt4/y0XXy52Qo07KY?= =?us-ascii?Q?L2xafRXhKsN5bQoUKQNK5eSimlqoe4elGHrYNGCQnosjjrlR0svB+Ryl9vNz?= =?us-ascii?Q?RP7LVdKJ2xLrXZYCGa+RP2BiS0/WK+kwSNor7Kv+KIHufopdzO63VN51SDkx?= =?us-ascii?Q?yK8rmm/Lv7f3RndPg4Uq4CbVw4aHa77G5HaGEfTuzROd2zRbUPKXeIpn9lCb?= =?us-ascii?Q?SbcURWMiNSglFnl2cynAEOPb8ZXYhAq6ZsLJi2uTp+3HxFvAt9Nhi+6KPf83?= =?us-ascii?Q?nkDzafAR+6mi8HKaCdCCNnhKDGb5cDFLSAiqqIjIcF4XHzJx8+Tk47sqoILH?= =?us-ascii?Q?BUjQXvSi59skXczz0douGuXg+SL8GdThJTqj2JxndFqnrRI+J2YWXxpdGhG2?= =?us-ascii?Q?o06shswP2H2Uj2L3C2dH+afr2uhq4JEeFKZtQFm/H+/HqN0OFf55b5n7TS2r?= =?us-ascii?Q?YIDk+W0piF7Q9Ki4cWwIRZMwroGQVAGg5bbu5KLV9TbNiRTVwp/42gc8pR07?= =?us-ascii?Q?BfvzDJObFxb7Tcjaahn+cp9/JIsEU6M14XDkVGIzJ9P/os/ewvUo3uXxQrBg?= =?us-ascii?Q?EOFOcFPI4jQ2HZF7ip3SrDAwGLYF9AbTgUoFmwnYpKRgu5LN4t/DZYIC6Ruw?= =?us-ascii?Q?oc2qbhqsmZcHER5zihv2iA4JewdsetuPDSnIpwljYAZP2rSAWgTNqIW9DVIm?= =?us-ascii?Q?kyHkD77Magig3rPLyNHT5fo8IxPChHj0ZvHiF81dNZFBOHPZkPn4h2sfBLW2?= =?us-ascii?Q?hOjMqlfGgjKLDRFErG26g0YvyMYesqNhKvtX7v5EkV/wY2xXBQs02Dst+Q7y?= =?us-ascii?Q?dltQUqMO5W/yXHXO/PCSESJdhPLEiRat?= 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)(1800799024)(376014)(7416014)(366016)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?W/OzzRfSwOHYnIzlSuA9413D5El9qLEFXUQvjENH44YQ101eXrPDkFRrpPXU?= =?us-ascii?Q?U6A5y4ZfjdxOqZjNjbfG0SV8RbLp6uUBEEn/D2ZBLcYxpiREvNsffD4LIbM1?= =?us-ascii?Q?fbJAP+fm03H80bnzN+HruNNcj/TEeXweJiikgE0u2gAVpJzNjAAl3bPxI1XW?= =?us-ascii?Q?4kImXS86rXX5M3I5lt28O9Yf2lgqbDilTPRLjQ8gU4hstgGhPyvtry1x24ah?= =?us-ascii?Q?ifRVfn4er6An6YkffjAkdevQSymKjHanaV2cechJyNNVFn3T1Huai24Cezmw?= =?us-ascii?Q?dK9gesQ6SjqBlTQ08wmWKkdknNQ0VI2nu/ZxzIwtG4/y2jNlOLqHnNq649It?= =?us-ascii?Q?Lhwtdul0QdRh2NCoa7Tx/a/Xo1JR5WAj4Z+z3RNUR4NiPQVdyaPtwqD49Oh1?= =?us-ascii?Q?VUW9z5+PegSGHxEXiYYqlGRgVD5VMaTHKsFDnlYzqwY2z1WgRm80wo2UGSWv?= =?us-ascii?Q?bLm4LpL1ITzkaa7FgMQ0lX6X6k3wKqx4jwAMMUK/cY+wnXmE54v+1vxbVALL?= =?us-ascii?Q?/YOdzlPL5qJVIEgCMLL9sSnWF1ddy4ka7F2nj9+hJnZnVZ4IrctdaX72gxfT?= =?us-ascii?Q?Iy5mEtCaxRCcWXx5jN2r7WZmS5UjcswaaQPM4IQALeZ2s4Nd1XYAdr28YRYS?= =?us-ascii?Q?XBiE6Hp3HxCRcv+uyWXlmViZZ7sgbYpSyCTTSaoSEw97p+3halQkyPRr+ul2?= =?us-ascii?Q?jys0+793im94uUF0T23vZxmym63Kp1TV2B8LvUy0qIfzYciu4l+huKiNs3+2?= =?us-ascii?Q?5rqV7u5leFajv3fSqrx7oVvuk3c92BOqc5AWBCmmmS/j0ZCg6CmLmMAYbeDq?= =?us-ascii?Q?Rj4GrZDt6f7Pjbcha9ijfqCEwu7uYBrvSyUwUQtQxA9MsadhuG43ivUzDSHN?= =?us-ascii?Q?tZEOLAGKNXr6UMqwGJYD/xAX/MX3btp9CFUGbnnBi1i9CXZlpkM1ubHAdQ8Q?= =?us-ascii?Q?fQYUbKL//COqjynQ1re+X5mySkoUA9Lq9fJS4Jno4PXmG0ZuSxjO0JgW52co?= =?us-ascii?Q?WiD7MKvv90ig+nChsQKK8ovC5Su/TlqNrc1jETvaIE/Zs7UGwcC5fhCiyzzN?= =?us-ascii?Q?fS1aWs9irGv8IU5hnBshEGF16M6mPmzsyBm5wCNetDvQAuzaH+RlOzJWKSmH?= =?us-ascii?Q?IdwqlyhiDS5oLp77OBvzejHGodJhp+oKAzexCleUCLNeHVSi5VrR4QDx2tRp?= =?us-ascii?Q?wrdHRtfJPrxVmzZcI++LPNzsMD/pixhc9W5AsK9Ne9pgHn8jWeTUnMkzDZ0m?= =?us-ascii?Q?QJnPY47SyH1QwZoXk7umEFraxVaj09fTpSc9jDq+gAFESWSbqEKdI/1UeACi?= =?us-ascii?Q?/yYLQjAOzjIvIWCkHeFRKV2Ddg4Fw4FFnfXhxOV9r5xci9AX/6Bll2cl7Esj?= =?us-ascii?Q?/ZRvlRSwoDbAAi+cu9R0JMQ8C00C47+yypLQsZWZ9wuKUnI46hWyBXVT3uO5?= =?us-ascii?Q?1cBU0BVMyMG/dhdcuBh+uHNJwo4x0rIki45UC8/EVjCYVr495UeJP6e/d0cP?= =?us-ascii?Q?Of3KOsw1FPvNCsiuV5Sb0zxKLJsRKjuHnD/VomnAhtF35cgN3pnRvghv31g7?= =?us-ascii?Q?DdprgWWBljlirsAxB7S1xeqHtk/wjgs8+8ZZO/kK?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e1bb37e5-739d-4cbe-7742-08de2d2fab18 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 21:06:29.1438 (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: eu2hRszKerf35ipSXbsh4zUUrv1Eth10qTuINt4qZIc91cbg6ZDS52zbSrp8uiHe X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7010 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 Reviewed-by: Wei Yang Reviewed-by: Lorenzo Stoakes Acked-by: David Hildenbrand (Red Hat) --- 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 1a3273491cc5..8db0d81fca40 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3942,16 +3942,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); if (ret) { VM_WARN_ONCE(ret =3D=3D -EINVAL, "Tried to split an unsplittable folio"); - return ret; + goto out; } =20 if (is_anon) { --=20 2.51.0