From nobody Mon Dec 1 23:34:48 2025 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012062.outbound.protection.outlook.com [52.101.53.62]) (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 62E2E225416 for ; Wed, 26 Nov 2025 03:50:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129020; cv=fail; b=cL5xYBYrOhSoangQE3izxTCxtv5GnBzgO4le7Znvq43U2lbbIGCAiqhIP+0jUPxeAxuhZetRG2IGC0g/1niM+XjXecwQRmUIcY4GKmwOTILKxg7MbxQEsglAQ+yuHzqCwyllmhlC3zlewj4rkOythpb53KbKzRxoL1qGY0eUhto= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129020; c=relaxed/simple; bh=J1ewRScKHfJo15o0oyiiGRVJeeGBipbo88tffQ7UbB0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=j4XGZbF3iQzK1mA0YcaAXWaE8yrvHY8d/vMEZdHof22/zBKVSzpCFQKl+lDB9z1vgOjsYCXecug1a4eMOoj22S0efvRlNqrGkeCXeQZUlDc8hBkjRHWIm1jJUqbw9fesdhg/TvULUWAYUjzTbYXd913BSMtM3A/sfI4Iht2vlbQ= 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=YI9dtQZo; arc=fail smtp.client-ip=52.101.53.62 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="YI9dtQZo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vL0ycvb8BQZfGsLi+p+7DMV5DuuftIAu6pKvUsB86Kxq3GILWIOJK73pVyuw42caj0KNCG8mwk6ZZSmQ1YT2uEG3uo6XqrfnnhDvytFr7CeMTu9Tz3p7O3oU+upnkHu6HeUn4S7Q8rVd1Ju+oBuJNBykGK8j+MQElEr2P5iYrbteXp6reHqRFw2uNHHpBiaHkZg1WdjzKKML26qMsP4CLc7duHM1MXVmaqf5x29tXpNVuJtNvoTwwL4hF0Q21nIiHnbmjw9F7yNVQFJLgufaeWy27VV/W/9JHOkpJzzI0nwHqRCcfrldksALfDe7xjlCmWVM9+0xnkaE1kpqa/RpMA== 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=MmAxdBKyno/6idkEmNjxudCr8arK4EkKmSpGqtcBPWg=; b=h6RDeGKar65cjyZIS1wfMUAoNbiSVcORv1Ros7V+cEXB65dRtY97GWmq0hIOHy6GjKyFN567PBxwdNHiaG7ZAaLSq6UCYa4581u/bMc36iWcj7hPSoFbe15TTma7S2OMjPdujAPSydTMUppU2NGmTkHp6TxzW8vy/cSeiHDB6C7Rl0RFm1ym08LrxefQcF52Besx1R1R14oj0odK8EsfwotEDkI9ZVdmD/ZkYu728ODxNQzPtQVkKPSPt/SHuIOm3ynCdBxVPS5PvC4zrrt9x+BnV5dVQn2YEvqnGDtfxGFIM5zJCchLsYufa6PN/SYn2ckxKwNLVeEBphl106HZQQ== 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=MmAxdBKyno/6idkEmNjxudCr8arK4EkKmSpGqtcBPWg=; b=YI9dtQZoauAKxu5zSwMqaFXGfZ2ob2/Li7Al/0TyrUIbZLOhBrqeUIeaLmJtFeWo+V1bguS5Idjykt5mVEM9X6Bdda+lesX15VPrFTh+Rb9rW2xBR/ccy0quEjbDL4IMIxjgJSlRifBxIEBxcnJSEn2Gb1nE4m1i3z0AaPyXGlh3KLnNLdceIxHUQ/1gdxxa5cAODbrm0/LkVq6wT1tLNaOLUqqPa11cWxEmJT0ZUDV/WJV5cGSnyyX1VkDOGix/ga9xHstwfrVpOP5hFVdFVoWf823xOs4Uyv5c2uW/HP4uwviDogvLNUDZSvWHKGLP8OCHaHCCGWtQjwe7xiM1VQ== 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 LV9PR12MB9782.namprd12.prod.outlook.com (2603:10b6:408:2f2::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Wed, 26 Nov 2025 03:50:15 +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.009; Wed, 26 Nov 2025 03:50:15 +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 v3 1/4] mm/huge_memory: change folio_split_supported() to folio_check_splittable() Date: Tue, 25 Nov 2025 22:50:05 -0500 Message-ID: <20251126035008.1919461-2-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126035008.1919461-1-ziy@nvidia.com> References: <20251126035008.1919461-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR05CA0021.namprd05.prod.outlook.com (2603:10b6:208:91::31) 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_|LV9PR12MB9782:EE_ X-MS-Office365-Filtering-Correlation-Id: bac5cbd6-dd2c-4c03-a0e2-08de2c9ee885 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?SBci8q6VLWI+gV9udkMJtyuPuCMhALEqCqh9WoQkuQSzy/7rzoKn33UlIYos?= =?us-ascii?Q?JCldqAHJ5VLDNx3kn6020Tav0b/Q/wyZUR3ndPirlqbUGxQdzoaNAsrzYIbS?= =?us-ascii?Q?sFsvdmKJBn9s3VCAM1US1+a1bE+PJiI2vGGstK2FMbLBxVtbueM1aDI5a83M?= =?us-ascii?Q?uUrSfDM9qh7Qp30kdDdlG1tKAKlfSpjfhJG8Pr2t7/HTnqdjgHHGvFqkhaKy?= =?us-ascii?Q?ePyeu8uou5kDUu+0bE0ZxILn01N9dsK2wxzeU00Xt3cN2wPllif1Ci8ljb+K?= =?us-ascii?Q?9rlOommpzraWD9grVTObZtt58TFKfrqK0oldHUJpMORmoEyYUgieYLshAxqH?= =?us-ascii?Q?k/RW9CkSr2NdNQQISP+ZqKqhsCGd7HpOPtaHoZqb19zcYQ5CllmG40576iI4?= =?us-ascii?Q?Sx0vmiYwq54T7Rp2282yAuzkKVoHanUm6h4wi0DtwonvEcUa+33mXQWFHVyW?= =?us-ascii?Q?w7m3Ia4F/g50zh6E36ZMOHAA8PrPIWgriNo+AqvMZEw5gfnnbFnbRaDqGI5M?= =?us-ascii?Q?1b8j9jJ8pSGjuLaTv7RDyvwwVh/iyt+SQuRcFKHdZtIyKRDXFteiIGm3LR3V?= =?us-ascii?Q?Koylti6PpTOcfVfrBL/1zCnqFxtKmKwJKPzlL4TyMDtrqYhB0LndvayDC8h9?= =?us-ascii?Q?TvJSD9jVh4QrtStp4Bw50QqqtrStmi2SV1Iibk4BnTpH4JhrwHLjqP9IjZEz?= =?us-ascii?Q?Kuff7oy6+3/9Tdfrg/terY7lhj4V3m0mFjoYJiuqiat8FwMa8Xh29nS5DeP8?= =?us-ascii?Q?O2YoTw0ZZXF2BvwLzMnqiELpozBkomLB6gFHxrpw+cP8Ev4HyNdMlhzWb5t8?= =?us-ascii?Q?k54V9otJ8P37eak234lLWjwBjXnoF0KEoAGvnyGf/ye91gIM9JAGdKbsNiLH?= =?us-ascii?Q?d2avxMCSBVoJv7GSk0VmltdRgHyiK9VQPjeF0VZ2WRCUIQVXB6plX3Uq8Sqi?= =?us-ascii?Q?mmg2u0WsoqNVvMLCsvqKzr1MBeM0Zmjzyx2NFhoBzReJqt3Y2PiAupM8mSmS?= =?us-ascii?Q?WcxtHyI5ztD4DO7XfSrl7n36v+p3d2PXDLko1iLV+IUoqmomNzQ8cTmqhJi5?= =?us-ascii?Q?DQFqMTsYTQAcQzE9BYZqWTN9dBWParZerprD2mlE4T6kJPEyiecblDLZzR8e?= =?us-ascii?Q?YIZKOOoHX4b7PNu04vtQcCuPo7qWMxZMjSrQhn/1GaiqyPioiWiwjpJNMW6l?= =?us-ascii?Q?VqMW0VmPv6tqd6HUFkbFOZ8qbaFPnPysPn0GaieW4AtpWrdwQceXeDLVydAW?= =?us-ascii?Q?hC3OBK7rp4mD9wzTiWeL3C1vlNOytCmMQf7iQaP+bx1dxM+oB30YNtBwALnB?= =?us-ascii?Q?b1BtbHrhGM6XCbqtgufXYjP+Vk/5Qo/AUn0RTNswLmEJnSzuhwlyKzBsU9IK?= =?us-ascii?Q?X1IV+my0WYBzvxFUSod59TEFScr0rNQRCcoblt90O6/ThmvQLJwWUibCESQZ?= =?us-ascii?Q?0+w0jzom9ja9JW0TOd6ZEBz/RrMDrWwP?= 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)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?tSCXyZ07IvL6bMwzLdyENyo+4E6K/6tLyLIlNA6a8UnT4uqqqx701k3gMdaO?= =?us-ascii?Q?0kyP+ORGkrlcRizpQ6tD8Yqry69hwNVIreYG63izWbYoqaN8ASDboPqrSS8g?= =?us-ascii?Q?NyBAzNuo/BJko7LS780aQ2wgEsV59pNTT4JJV0MbgVYasY5tNY6FNRDnF+/f?= =?us-ascii?Q?5mBD2zp6WqGAaBgzIOSBmkgQPFG7cNnhT4w8mgYqxV/YgaSL/5YBD5PSgly8?= =?us-ascii?Q?58WKpfiedawGAe22/3Cagb/VYVxByMiKItQBOmTIlrTS4vjx8O4WvIwg/uGV?= =?us-ascii?Q?UP2w/XKevCzcxRqo7puFtvXnIu7DgLWoIXS4IvWpYLE1enRdECfBeKOXi2yS?= =?us-ascii?Q?vaoJVV491yMlwr+vlJp0urFw9hddvEsb+Wp5UqkZ+QUPMRlstAFdN/+omDqp?= =?us-ascii?Q?uKxAXRn8Ra2X++IuI+U4dYjsVyn/1aDPVKObOedByh3B5skof7vm6blE9oGh?= =?us-ascii?Q?CM07Sh481F0JD851TiVaOnmVV9jPW0IXXznIZIQOP+xYlk3JHBwZAk2F+PxU?= =?us-ascii?Q?kgaWhL/Bg2+SHRQ7c0mbk4n19MCPdQW7pYpHhSAf2n2HDjI34hD1C3qrLJWm?= =?us-ascii?Q?O8nQpi2TnDQiHs11nFLKDo3l/ptKgKrfWAGMj6983ti9g4n49K/2vBLLOzKN?= =?us-ascii?Q?1bEGtLbHD0qV0dGghRVrr5Hamu2BInnw6ZnKH/7bzPJ54mAr4uu/TgMn1gZw?= =?us-ascii?Q?+sgXWx3CPV14F8dHLbz+zvObpvAgHywEhvjNE7xBUvaDqznoDvyomA1y6MOS?= =?us-ascii?Q?eIrfnlcKBoxvToV+NF9iT+xnZ1GXO0WgLRRxYKOgq86GTKH3GcF4xkWZy7ez?= =?us-ascii?Q?6toCZO2QiXqId8lNfoWvIPagvxiC0sgFkRQP6OHkbnkmaEZOIITIBNW0SiTR?= =?us-ascii?Q?64tmWVqqUzSXidQeF3y+cX4XPHliPZsHt6rHlYG6uX2TTgkCKjT8CwXc4waD?= =?us-ascii?Q?obZttxq5VSyCxcOvo/+QPvebMqFtTPav54muEaBxCVjZMoTueCCbm18UbAgJ?= =?us-ascii?Q?l7ioZOhIr4JMpdG1Ox77Twxj++UGm+N2F3PlnnxcBS9oKEO9CWOQcnjoN8hv?= =?us-ascii?Q?WKRFTMAG1/Xf1k5/mYmUlsVYvZ9bvkkq1bDe2Ybfc6H1WmS8wCBb5H9trMa8?= =?us-ascii?Q?AsZl1pb37AVsIUCSlFEW2VJuaiQgKyl8mG8p23MPEh2uOL97tJaDi4Og/gvz?= =?us-ascii?Q?M2qRc1i3dtvcrsylK1pwhLgZEbkGzJpCTojCxD8/MSu5qZZhSp26Gk5ZsP4/?= =?us-ascii?Q?UgnPhux1ruKYXixVxPtSMPGBvdygC+L4ht+U3NIBF7fmCCwYTdfw6Pr85yDA?= =?us-ascii?Q?CTjiJ5Pec2/Yt4EXk/W5p/llJmc1opA/RNh+rXqRiDiaOAgFGlVhbXh3C8ih?= =?us-ascii?Q?DZUsYxBNkf5tt8DFkhL3ermb/f39dseo/UtQmm6jFNhhtUJ39U3IvVXCt3vh?= =?us-ascii?Q?oxeLeMfSvKukaaXJz1IhhT5req3hTfUtrJsUFukqbopaXF2SgA9h7AI8y8DC?= =?us-ascii?Q?GCLa63Oemc9nINiEDe0+eiXfom+OTivR7hVhWr+fU6GLECOfjpDO1u0tmCw9?= =?us-ascii?Q?pa4TFs0FXQEOmnZ3ipuMPh4cJ7bSbGlTt5E+cBUV?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: bac5cbd6-dd2c-4c03-a0e2-08de2c9ee885 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 03:50:15.1758 (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: rwP4fmU0v9vO/2CONEN1xaoGGNZ3MutWLd0nUGUVXq+tXi4bO7X7lrx13k9pvlN/ X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV9PR12MB9782 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) Reviewed-by: Barry Song --- 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..771df0c02a4a 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_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)) { @@ -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 23:34:48 2025 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012062.outbound.protection.outlook.com [52.101.53.62]) (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 39DF830DEAF for ; Wed, 26 Nov 2025 03:50:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129021; cv=fail; b=jh74kAlrkiM1ToknkxX7Xq+gGtYwB9VygGulh90NvhqMT6Oxuk+IQ/QKt3GnVXv14XUQXcj5O1Ybnqsiddf7g4y617hXsOS68lX6gqXGroL3q5ftNysnFXZYCo8gzgOCjXxr5myDM+9/HaNlvQ2xHvCS/pREO7q33Mfopk4/YIc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129021; c=relaxed/simple; bh=U1LjSqy5vUP1XdWXUn5F+HfbgRbZZc80A1GjxiuBTUs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=OrSDK7o/G4N4UueWF0DzaAeKCf4BJcVugQ5HJ63dkeNpusAtj4fOuOcUaxtEL27drR9NxNo+5jwvwl0sHwVl/hTI8OeHQeej15UkI3Y4IxLQlFjUg5M+KVyzQcz1fal0wrd6jN6ReF3x+MVMiHOeqe4pSR0lofWIxoXatluErYg= 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=s1EvkbSF; arc=fail smtp.client-ip=52.101.53.62 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="s1EvkbSF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bpm33deH5UJ1XS57qh4dYeuWJiX2Lc0S0gLnZtiacfioPedg1JurbtA0PTTIm6agEBEdOavXDPgqvMjEwsLBJJZxrg/eDXnjS0muc1/AbCoaSt7XN6ElGk5B67Pby02BGcKxen64hl6JKZ3+yJepYQi4cAesOtCkTy6zwaXTYwIYyErOH+ONchgtKC55TR6iGq3UWXijHqWyXMQFVjINwS2lqih768HspHDUc2M3ESVtgQ9LnPlUPQ5zwJdh86WUvot75wG0pmhAPU4n0pX7yi8SFt5rkWhxKOGlS9Ufx0Ag2CATKdHx1AMNHrAXVOH+04mqF+klxBNH5SLpNCmDzA== 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=2P1yQHrSQ8wYt8JUlrzWkgTxC3OBaMcPdNhnea1veKI=; b=oshPPUGSHytixQaoN+PxPAT6HVo7qo3HybWxBbJ94HIPkKCYr3TbpvKzWjKU8jN7SMXk8U2W6mPlP+tPHNt9GomEAjEbW92QELUkTHwZ4YsCsTUaskJzF0Y18SrMEw/OdCUeo8mBLw3CFHL4WL4CcYlTBVnbm88aRR7oLFcON/d9MLZD0yNyshO1EIMKSY6lZfHx5luec3FGd6F415ZRrpfXc/+Szl67O9f6k2H/ODZppoWO8F2aSzBcmADVwJHCR6GQUmc4Y9wBwNMImQBwqOiTzztNvjcC2kLIqI/7Hq/L3qvBWB9xRL20LECApdEgeceVg7tmLJBzobhElwGz/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=2P1yQHrSQ8wYt8JUlrzWkgTxC3OBaMcPdNhnea1veKI=; b=s1EvkbSFB+NuaXY0IpZpj6464Y5nCRhaC6Qu3cWeeDs9OzeCIPW0sjYp9BrIQUVScm6GpKwFJsJJXHCQ4Fu6vVA4rMjCXc6DbC3Vm8hO4v2nE17ycYbWxDIskbNkQ0hB3A7GhF2KKA34xhCrut4E7Hm+9t9Ra5+iTgXYsIFI9E4HWXx2jc+XX6kRCALrWuyaPgbjNH7MQZRZwZRfd0mxwsWQ26ifyvG6AZsxKifid37HueDyOWrhLkvSHbuk/LoNE8KLkPyh51vN5rw/ZCUZWaEs9+SRNQsdayfaRR6SvPQ9mGh4x/xbF9wCIf0TiwgtODWwAc9Ax+KDFx33u5Jjjg== 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 LV9PR12MB9782.namprd12.prod.outlook.com (2603:10b6:408:2f2::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Wed, 26 Nov 2025 03:50:16 +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.009; Wed, 26 Nov 2025 03:50:16 +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 v3 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation Date: Tue, 25 Nov 2025 22:50:06 -0500 Message-ID: <20251126035008.1919461-3-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126035008.1919461-1-ziy@nvidia.com> References: <20251126035008.1919461-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR05CA0008.namprd05.prod.outlook.com (2603:10b6:208:91::18) 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_|LV9PR12MB9782:EE_ X-MS-Office365-Filtering-Correlation-Id: f97c6235-5273-441b-1da5-08de2c9ee960 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PJShp25z7yScCvrYuiTVPNK/2gpIdoJN+gN5+3sKlJEeFLMKf9L9ASafvLhu?= =?us-ascii?Q?h3MypWmCGEk+TQC+ixt06ih8JoCXGCDnJHzYOXrxJIsZVwDk18uMj/xHLfyV?= =?us-ascii?Q?nlRgYMIWDliA+Ceme/YVGKIROmYkHkZJLL1akx1t7dvykhMuu3XiZ65e1C6m?= =?us-ascii?Q?w3j07r95PsVuThhJtNVX78TZ5SoqP//P9LXhfSZxk9REblIiEyvnc8vB5H4m?= =?us-ascii?Q?zF9O1x/Do/ET5+RZtrIjDekGupSmc2g7DtLPxe5PVeiDKUq51P9AYBRkmLb+?= =?us-ascii?Q?o0ReM/de76KqBK85aTJJTe4CyNw6NO4VlxQUeBGlO1ic954hzAOVsydJ6R3Q?= =?us-ascii?Q?DJfXNORwRflDN0DymWhd1/uJoMrMlBgnSbCTbJrqWzwNg0x6vjGjpVm2j2e+?= =?us-ascii?Q?9rKAH+0f2Yj4xgjK27RDhww73mZZ1c9n5t81i+TjxCCBaib6DD8bjf++Aw9K?= =?us-ascii?Q?LJmKpWvwNJC7Vl0nfdTxGWJxMu7f4p++m+RSV9XMVm/SQJQ7kJYZv4t814ab?= =?us-ascii?Q?Q7fGW3idc9gQee3Kz453pkXzSdxPQMSTIY4MzCmpPFkx7NMKxPQU4v01Grc2?= =?us-ascii?Q?hDPc4VqXJKxPQ6ACE9JlkCmfSgfHNxVhno2FUDIEAT9pPgxBKibMBLWMil0W?= =?us-ascii?Q?UKBLrApl54uA6HjbKjGvu1QdCUu0UhQCPKLn8zDXmf9G6OuvD6o1b8pJFWGh?= =?us-ascii?Q?e6jluYKoMDlUZ5af1mqGhKPpaivLrYB3uEP916gif0to2hk6ou7dC3TOBgYT?= =?us-ascii?Q?bRz5MfAJu3vilIAhdjx3Lv0zLP0ne4Qy2xS/CPWNjQ276yqhiIC8MvtxKJvD?= =?us-ascii?Q?E0/VRaMxZtYOnhFQAuAvxd0TMAgW15RykFFYZqbb7TfMUYC4s8W890oZNvYv?= =?us-ascii?Q?cbibOD3zCLrmrFYE1aACbZVS/y1lhwLH7+4CdR1m3sv92diVfzNbx6QvgQZt?= =?us-ascii?Q?Arq14EWwIoiNFACa31z50AVsPZL06JT7XOPYKr/eBJe6gXT1WYQ86Ju/2tDu?= =?us-ascii?Q?Vf2GHmDxWkPyyW4d+v/1ckyZGaUxV/xbanroA+YcEV6wi/dXnp6WyTzCAFzr?= =?us-ascii?Q?dqD+gWU65IUVGSz0H52qRgTp4qUkMkemWHco6ZAzwj8IPG0G2OYwJvQkfK32?= =?us-ascii?Q?4Zte58G/SyY+XUcvu0Z7kK8lXHNetfkQss7BXGmllFe5DcopksWSpIWrFJh5?= =?us-ascii?Q?buCviCf2nvXLDl+pN6qFhjlqunL/L0VuKCA+H5d+zBGEUoNsoQ+x9Q5oK9VB?= =?us-ascii?Q?98iAJV8a1xhjn8lls5vKdDf+gVaObAcOOnzr6Yy4dcIiFBJoMWXK6ihdIzgI?= =?us-ascii?Q?vq128HH7k3d726tbbq7tJzAEkUfMB2+hvwdGI5in5iUbcqcXCHzDnNbpT0vj?= =?us-ascii?Q?ewdYVMO9aXFLcgt0VMbqaNz1LiGc2xQmoRzukckBsuh4HbyH6l+SIVj2Ot6p?= =?us-ascii?Q?r6fxMcgS29aoGyPKsfhWtwIYo3hB3FH0?= 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)(366016)(1800799024)(376014)(7416014)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xN05OfFhQ89YhweYmzj5PrddRxTzEV++JhplNVI09uupFDtbE3SC3OJ52Xpg?= =?us-ascii?Q?tpHTbpzosx/XvupQWYerllWf6OtlJhyPCld/c4pUNcorzlC31rTOxCZAm7ei?= =?us-ascii?Q?z22Gj7rNMa/ba3lGHwIlmmtH62cTxAWtAggP7NVTCKYSHKFNmi3tAxOznzu5?= =?us-ascii?Q?jdFUeLje//5+Ud7Barl9fB24BIYshmWEGmxOGKQJ1OUFvmKt1mPZCvbPk/gA?= =?us-ascii?Q?1t5XPl1RDQZ9jEl04sMMyAlfo/TDwQa7oZRWQw9DKKeG6LygxxHwMvFNjFyi?= =?us-ascii?Q?9SaQSE3yPzhINzu+31aPaBX9IgP1ZK8Yw7lB8IfMDBhZFApWdQhrY7TpDQbY?= =?us-ascii?Q?HEYYYKDELc4ljuwovqZ/KrKZHcwKS3WtFb3F5gJ18+7CLGl7yBCLgo4Dm3U6?= =?us-ascii?Q?4lFH7S5kUda/VvHOFP9HcrL/E6P9la2asdyQaO196mMWXFKL2eKSnDeyjk7R?= =?us-ascii?Q?kckJJfQX5UuF68AdtP3dTmPcFFcmgh3bebFuU9uokdT7N2TjnmZSrxTc+LSH?= =?us-ascii?Q?bWZah/xN3sRDD7boebAQTyRAyICrauhTQB/0KujyxBzkqIEi98MUmDSgkqP9?= =?us-ascii?Q?nb5P7p6da5/wJ6k+IK2UXS53BuQkODVgkRWQHoQEnBMi/Ovy+pYrF05Z2jYI?= =?us-ascii?Q?Saq+bvltt673q1SN8rcCrlwawO5itJZbYaie+YJcC5Z3SyxHoeqpDJgbcx2U?= =?us-ascii?Q?7Pv31hu1TFyk29r9LgC//uNVVMj3fy1VesUnAP1GYmfC6ywTvG08VV8btJB1?= =?us-ascii?Q?3AHO+5d9GvDWCwxnlCnum0D14Ctc9+HF3bC7oUQeihVs3OGAZhf6DbwtOyYv?= =?us-ascii?Q?ZWTf11UMXI9NM+EZXscg+FL6sU6ZLBpTESJY1AnxO3mzu9OhdX39BAiT8q1t?= =?us-ascii?Q?83bRlEVsSOYoU3Gv1VfhQjvkhSFqA1ccvgD8vIuvy12Dg+3rcIYESsK60hJb?= =?us-ascii?Q?bcVcQbypLwucpUTvCR49xYig9WjEyrpc8p5tqq9ApxazLrmFvttfGFNQQcTU?= =?us-ascii?Q?Ot1DMqZOrxYlp0MmSwMWJvpWHvEenr2wpLaPNNCBjpZtPA5uQJ44CGloK2sF?= =?us-ascii?Q?b0yrNgncHSTXxWluUPxU/XqTG1IsttAT3lL5VZD2/zxoJW+yavXTmo7wR3tf?= =?us-ascii?Q?fnAqnq1QtD6xYhgzChA8EYSqUQnE4+RgcmYj0OQYYfymaVXBP5jYCMfVF+Y3?= =?us-ascii?Q?uHfRB+hx7YB8SgqaLGRUkkXBSpZcLLkI1jo55Zk6gKmkuCKK7P6UmvOHenbw?= =?us-ascii?Q?mFf140BrD7XCeAHUr/BY9ntPrVdhR6G1Hk6OAgQLjAj7n6zjfztLeQoO+vBt?= =?us-ascii?Q?JN8p+QsG/YYd5IRahT80ZgflPlrZZYrOu8l1GFiJ382YKg32WkiiQbaoAZZO?= =?us-ascii?Q?e7IbA+P4cj46b7Q+z/fovZMtmF7Qv2vG82T2zVFqV0S9EK40GyoLxs1eCQ9x?= =?us-ascii?Q?u4sYMOs0Y27hEVBPoxXgrLVdX7Ek0ZH8h5SS1Ue52nMxfkSbOskTRLuMoGSM?= =?us-ascii?Q?aA7Y3HrFIFxqnxlYDPDyjpDRHrSyO95FnXusMiBO2gGUPQxFRaUFm4XFMnUo?= =?us-ascii?Q?5MH1e/gmVPCT44T45IU5PfqYPqUOe+jGc9OdB/9i?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f97c6235-5273-441b-1da5-08de2c9ee960 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 03:50:16.6052 (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: xMj67KATvK/hGHUXbu57lSEG5y8T+b8NwHPU1NSXCvD9ms1Zxrh/1z6VF+9+7u/4 X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV9PR12MB9782 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: Balbir Singh Acked-by: David Hildenbrand (Red Hat) --- include/linux/huge_mm.h | 1 - mm/huge_memory.c | 48 ++++++++++++++++------------------------- mm/vmscan.c | 3 ++- 3 files changed, 21 insertions(+), 31 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 771df0c02a4a..cab429d8fe83 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,7 +3773,7 @@ static int __folio_freeze_and_split_unmapped(struct f= olio *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; @@ -3853,7 +3844,7 @@ 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; + expected_refs =3D folio_cache_ref_count(new_folio) + 1; folio_ref_unfreeze(new_folio, expected_refs); =20 if (do_lru) @@ -3897,7 +3888,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; + expected_refs =3D folio_cache_ref_count(folio) + 1; folio_ref_unfreeze(folio, expected_refs); =20 if (do_lru) @@ -3947,7 +3938,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 +4019,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 +4042,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 +4116,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 +4622,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 23:34:48 2025 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012062.outbound.protection.outlook.com [52.101.53.62]) (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 1A98030E83A for ; Wed, 26 Nov 2025 03:50:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129023; cv=fail; b=Y+2aHwtI322TtcEmxsy5TtgesYau6qsHero7PXGYlkUZvsHYkQHrQQ+Ii7K3LdfCngh1Rjyik2CZZsU/TpN56vXXCTg4IO1paRQFRCobdBpuUkRyv+eL1b42XO6yZf4N3K7kPwYARUja9NfdLtkNL3Op77fO8oTlOKKyNrdm32I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129023; c=relaxed/simple; bh=nlzORf1bxjkxPalz1T2dKCfDckh/4l+UW63RFuY28t0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=O+icdiLwMSODRB0ozvWHBT+qG1moprSmiKrBqzH38Swl8AZ3UlOcwwIUjRK1/3eMpep7+ytNeiSfbkMdAFz+nzc9/pMYn5gibZTTl+wYDbm58Rk/pBPw/QYhn2seuJqgOkuB10f7fI4eyeIzYD+mui2MgDhpNFJN05OOe1H/Gy0= 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=JwWFGkSF; arc=fail smtp.client-ip=52.101.53.62 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="JwWFGkSF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GxGZ/ybWgmMw7gxIVmeNG6HmtyNNx4Pvpf9IlXBOD6gPnFkceadS1OdrjZbofPOk/YIzhuEPgX1GTEvN4KKKKpWrfBd0z1Pr0LdjLY0WIEcCddXLrSaKWiRObFtZwOGyIcGzcSBpnhrOovhfi/SOb4RGwt1bMzAlbWsd+LyYsX942PDCz4x817ZvhzfjN2DNCejI0t+YFHaAZC7kxFPz6yswZpIJ3UYuv73/B6kURrK4Da0s47uD1bzSg+lhyTIHFfXB7O3sbmBCpuyr3R6w5YKSHzFdF2BmmpBJvmbxbRtcmngwazPkUoOtoUgbvnmJxhufVUk+iOXidYfYlCZYNA== 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=kFbpwDaqUX1Wl7rOcJh/umOGeURYgcUSv6WMoiUHZfI=; b=C2BTbWwvbgsnlkAIKVlngIV7O0NQIZAhxOKzzuxG08pd5OwntcbHU/Vu8JLFIIVPIsq2dZw4cnhlAJV1Lv4xcU8m0/PGgSiRR2lqUs802urAQFaVFU5Xpwos8BQmwFRCoHKWjbauRMOAG/THkq/brAx49EZbkfABsX55COC8or8NHAyBQsepK3mDa5ozvPP0l2KdxBw8G1MpRgeGx39CDszl8rQuCFuLF5DB61RsCiKisl+WXChx1XHLtIb/7vkdQcvsXfOpc54L8844nyZ/hcsMeL83tIEsu8/YhbGb6bq2SadLPzatFZXXyLIuz04EA1iHvLXtcloZdgYrAqmqtw== 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=kFbpwDaqUX1Wl7rOcJh/umOGeURYgcUSv6WMoiUHZfI=; b=JwWFGkSFo12NC80v7E82Wbk8O9MjDAaH4gwgais+uSZz4ifIYYU8ExUHTlJAbvlqtvCcLMKQTppQFJqjExDaGTfcwsDsG+TUC/y1RGxQRQoW026gbo8fMEiAtyZb99jMzthw1MVS1K3qj+KZd6M2Q7f+YmKWonf4Ww15xOo6wDfnDvM8qAExIvgYWwn7JVvh56FTmeshbEaJUqx5Rz7gxzzcFCKRwIj9A0taAp4ozuWjl+P97Y5NxYbWvBs3suINduhVPhtZAkApo9ks9ieFIkAMfd9fQ9azaCFw5sEde8IUeTVy5uH1P+3bOLtWBUYL9Q6FYt3rqovrQj1yFHvrvg== 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 LV9PR12MB9782.namprd12.prod.outlook.com (2603:10b6:408:2f2::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Wed, 26 Nov 2025 03:50:18 +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.009; Wed, 26 Nov 2025 03:50:18 +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 v3 3/4] mm/huge_memory: make min_order_for_split() always return an order Date: Tue, 25 Nov 2025 22:50:07 -0500 Message-ID: <20251126035008.1919461-4-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126035008.1919461-1-ziy@nvidia.com> References: <20251126035008.1919461-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR05CA0023.namprd05.prod.outlook.com (2603:10b6:208:91::33) 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_|LV9PR12MB9782:EE_ X-MS-Office365-Filtering-Correlation-Id: 81c48b46-eaf1-4402-c830-08de2c9eea45 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?UvOGEku2uFVlhzmy6y9f2ZqTX68OJoBoRmwSuCrG23sWQiEE/Px9f2Hn/N6m?= =?us-ascii?Q?K3nXhboIrtg+NCwdVxmt7JrgUslUjxHTi0cnrw09LfDZKGi440ImNWzayDIM?= =?us-ascii?Q?MPRWTbpE/iiJU9YXoGYZuUo4jrE5J2aRAyT5sdtmeul9sKV3yLtKTnVXazVr?= =?us-ascii?Q?wDCN2wik1AceQY2BpUkrIN4+UjdqOZWzuxfdH1IohYsC66KhAUPxiZ2Wg/PU?= =?us-ascii?Q?DIcGdeE0ScYNBCePBd0PmEPowodrkEjOuTiRlr8h32Gog/q6UB2WwSWQ1Aui?= =?us-ascii?Q?+cXY1wkZ72S763gwDzIJ04VrdxrK5MlGdnOKWjLK2sEawAwoo9qqos8S+YFh?= =?us-ascii?Q?DVGCq+BYE2A1O3ZnlHNUfJVlREBd4pqTrFk3ZmbgYFPiJrv1p+b3/YdVaD/P?= =?us-ascii?Q?G752Y5BE16Z49B2xUgqf+7a0Q3Iv45P90x27Dr98wjSz5SVzeDbVC6XrY2Cs?= =?us-ascii?Q?jxqUOTvQ6BrqOfiHn6jbcww9KqlIq9SP9sivRebvGIfIGzOYVA0DwXrMf+7N?= =?us-ascii?Q?KWazwrnlqmOMO7FJoNBAO89kyeaKhnRQ5AdLNq98V4aobEMLOH7HIZGixScD?= =?us-ascii?Q?OOriiUzilTcBMgMCMDnCdSBFZ4tpfzMU5stL8jBom7pEy9s1aAj8VunC1QDc?= =?us-ascii?Q?IEIjn6+sYO/r/kkgN3/U7DNmcogwIj2pJYoNMo757EGK64R1szqC56gJwn+H?= =?us-ascii?Q?p7OzAUW9sq3esfTCZXBpQ2kjuY28ykfjvgmHB/yLaszk9bV8+At/r9q2YBwi?= =?us-ascii?Q?XzNwh4wVP+Das+IfX8sPGT50wsro0vqSFb4CamKH5on2sGpWPJqx9XJpbDq7?= =?us-ascii?Q?+VJkpZ+Uo13ZaP0xHNeJWm/EgQl4zoygNXpZ8T/PcuzRqOZ2DhS7DjKshmUH?= =?us-ascii?Q?Ah4yqxL1/605eb3pw9+9A5OMSfKyJcGqyWROhPLRUorAp99VPyA3DAr1YKip?= =?us-ascii?Q?AxNnpkWFKawEaR2fnJR8FkVDP+JMtnM85XCRNytmTPfbtyKrSWZW3uOZyEGX?= =?us-ascii?Q?LSnsGikHApI8liSNzrEiL/pMBDKfWJoryjcPZ4HEz3wO8oa8QRG4HjBeCgci?= =?us-ascii?Q?eZd4iE89m7e5/6yc5Qtic0V2YPMFvKTCkSsdNfpH0kvHg10gLp1ZU0TcKDIy?= =?us-ascii?Q?YrEckBBPCrWsw+VsKAEnA0I6q2scIBdcHgPNFTq7Hbp3nscaN2mrOBgEW8T5?= =?us-ascii?Q?R80TGTpYsU8/8IZoF+I7QPBIA2mD41bNon7CJdfVVwWFA5oFNBBob/nRsTGO?= =?us-ascii?Q?u1FJAM4umnHYdK1Xada4LFfr9IA4MepXGvS5E0j610rDBKcEo3y/8CME3tzV?= =?us-ascii?Q?PNJ78zpzigApldNLYSdDZaioyCFeTlFCUauvC+9hQDWDTlfVxPbOebYPAR8n?= =?us-ascii?Q?2BzBZcMRoNzo0m8M5Qz0iw02j0eUoapZutrJ0JJjpBPAXf0new3QKTfTLO8+?= =?us-ascii?Q?mXh46ic58Lu0yGpfgK6Y/Ob3uP3Sg5X/?= 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)(366016)(1800799024)(376014)(7416014)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4k8p/Yni6T3EHb0IHSHY7THvWUGAsUAGmBOt7yV1YIppkygyxMkJ/gDS5Gp8?= =?us-ascii?Q?utVzDaD4jUz+ZgNr56Mo4KbSVojaj/RL87VrDN+T3nhRQ/DRqFuN7bNGa8P9?= =?us-ascii?Q?AdWp+efscCrhC7pjUMjjLnI7LI5KIvUGswNXyOsgia1IDYjqwKzyDAwg4LAu?= =?us-ascii?Q?jQ8KXGjOkttruHM8xzT3KPbf1e5ooDcTg/P78grcSCCaTKzDxkxbbuJ1U+32?= =?us-ascii?Q?glqQQoR2yQIpJAvBHV80rpa8rSCX5hLQ2InVzJy+SBCnjQnwlaBN26tM/Mvs?= =?us-ascii?Q?y+DrEOpCt4g9lyecPaRkMG6K3A2UKWJdac2Gzwx3Zfq9jUcJWdeBT2v3vhrK?= =?us-ascii?Q?ilGWP4YTJMl4WQhWAvvOZVrq1Sss8VFe9fC7gDuXTFokldlvd7n1QtJR29AT?= =?us-ascii?Q?ejwJZMFoLha147zEahN36O7ExOeLFVWveAUBxvW3KMe4toaBlN9ROxc3G2Mo?= =?us-ascii?Q?DDu628GIvZQM5BZgDUVpGU/LxYkzQ5zqqfd4XoUg/k6DlnRDhgti+I94k4JC?= =?us-ascii?Q?oDPoMb1Hh3WfvYCwSVFGuFZrJapCenxeIDpwH1jk8WF5jxAIU5wGF+9pFZJc?= =?us-ascii?Q?rgoAWN8JocFxT/I+O5diPEAXiyjrQDJsvpi3Y8Cp/k8e478xtRLx2sYBp1Fm?= =?us-ascii?Q?BultR84ynpKl3/w1llbTa2Dpd/E9HW2aSkQR2Mzpal1gV29wNpXFftVNg8eD?= =?us-ascii?Q?+byY6fVf+IvNOKAniOM4uEkEfGfx4wHLpQp2dI8KWtjHI89O89TKuFle8Ukg?= =?us-ascii?Q?VKJEXJvG7dpjwiM+OIoW0kiQp2xQmDSj5NPeJntecs6A4Q2G4ohnw31Iw+yN?= =?us-ascii?Q?NiMFd6fIkXkw3DvxKLQlw+XkEGyXkP6T+Qn0bGK35ligq+nxSWjZaAA0KcfM?= =?us-ascii?Q?29MQAabE+PnRLYEkKz9NGnaC+cH4oy66uSITq2RKm/vSUc96JjJLqRqAs1kK?= =?us-ascii?Q?OhukWwVi9s6aNaeuy4YFr4RBvGVL3HG37PnfqI+eEjSG0seu4o14F6NpCHgz?= =?us-ascii?Q?QNRU8Z7e/rY60ZJVfaU1bWX223WfWqdUsI4rRsd1t3I73Mp3sDZ6AbbaRwST?= =?us-ascii?Q?L7Lj6XHS8O8vJ1plzlGa6W5kx9Wnhe28AAYZ21jN6IrOD2pHBopCeD2IqtlM?= =?us-ascii?Q?qzMZ44N9KnZtb8DxiU/3BHsrm80cgXqMfU8gFwS8BIBYsMiceT9IUclgehF8?= =?us-ascii?Q?fM1hFq7MpG/r9SIy7lMd8/zA08FUED3jhazDlLPmacEwPfuEg4cikoMImqAt?= =?us-ascii?Q?WPY7wRIlgcJnbSHcuah0nZ42oIZvxNxV3yUprpaMNIKX/0EPSpQxZE6kxHTe?= =?us-ascii?Q?pmcNoSyq8DSReCRp94MxuJpKySaadD8YeEuY0kjPAN7e8xZ4HEgz8osWCWNB?= =?us-ascii?Q?mHNoQMveHDf1+tpYB/8vj4u04VXMRgXjMcwuaPGw0rPNjzwCJAg4XY+LP0Ta?= =?us-ascii?Q?i016drstW+VFlF+3j4arxHCK0jpSokjpNzEpSrKEAkTC1HIxRdQi1nPoDZ2K?= =?us-ascii?Q?EsH/RLK4IZWUmjx7DRc9DUqnXNnuItbumzxn1TvqjrMeM88TU6lJCZuGlh0r?= =?us-ascii?Q?j9r+ws3yoSSI0UZoGr6ZSUJUXA6xuazDehZVfatE?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 81c48b46-eaf1-4402-c830-08de2c9eea45 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 03:50:18.1146 (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: m76J2xqf2hQc8tnwisWYLfXq9o+iGGTjftXkB1vVMD6HMdy0X+u+vf+Mi2SxX2bk X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV9PR12MB9782 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 cab429d8fe83..3d2396bf5763 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -4221,16 +4221,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 23:34:48 2025 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012062.outbound.protection.outlook.com [52.101.53.62]) (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 F114530EF62 for ; Wed, 26 Nov 2025 03:50:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129025; cv=fail; b=tMFaSJcj4N8HWFbWvhUItaAkEViU6+20RtdtOsHe0Yw3/UlAOk5QdreUiIBOkTKizpDHut5MFYqUJeQNGCuIYXyMjOUeWORD7ukck9HONawV267rWhxOGpS+Gg8FP53iNey50KzSTHHJjfqvqfHXQDjUPxssD+tdpfK4oVZp9uA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764129025; c=relaxed/simple; bh=6uv+G5g1pnqMtlm1zBYlrY+wD23jnhgg05ppIeYKOKU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=lPnDVoJYVqU2nZOXVPbA2yZf2iqD9y6ym93okHuRJjDDv0sPEXci7gYrFerrk414agSMA/bXr57PgWxMtZU3DDXndHKXF8zRIwR0glB+pQr35y+nZDN66LAnK0eKXNiXvOxG9bed09nVD/6WbKLmb/ZNqK5DpYHX7uQksBogL74= 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=GcdeXpOW; arc=fail smtp.client-ip=52.101.53.62 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="GcdeXpOW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vQfVN12VTeeZfBrC3o1DGQqyh7/m7kYJyJtO4O9/mSIG+orhIWgE9AL6wDDYmqqnkR6YHpUjZC5AYnSRePcLb7WD4XAKP5dTaokcdwcLeKvHT4SudEe9Rpn2QxNfOnHT/OR2a0zxi+HyRayiqrFyJ8mNt2UjC0dct816m4X6Pfbk+zAozcVa27CVXf5/Npx/eSNWcvtOnpycQv2DBBOFnRBlbWQ6+PvZ6G+D++cFrZTez1SiV2cknOc1TNg1ESUQU0bZpoGhebRWUVYJFC2a/r4FrLtCyUxqjCOHeKywlMDgUmto5wAv93szr60XNDQKYCZTS4rQlkt1oY2PtsAOoA== 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=Y+G66bJstCt+lztKl1UgXEHcLQ9ZTZEtKHy5ZQ8w9ek=; b=csCTQV4XtkTBdPzTgQc8UK5R2jLABHEPOFLd6YCKvOzNR3Tj/lTWu2zsQHQyFPJUBsR6Dsxhn9ftHRAb+/tBu0E4wrZaZJBb7dGMsDeaQ/h5yzgKkfQ+1FRVfK3rLPHZxzwMBoChQMEAcI7wDkUdQowyuVuHt2OUPaSoOf+bw9djTPHvrxwIprLI9QDkSUMXtONj8HIH6mNdaHAJ0V+swmTPJ8zmdFA96A1Ga6Q4dV/znIJomhYPkoVeNh0f721cQZa0mc6hzpyBfxUBp5ieVLzL5FoGUDImyByux8r0ZCJPMtGXAfo9vmeVWuKsKWgmRYxPnon/ccEiQfD1f0uxfQ== 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=Y+G66bJstCt+lztKl1UgXEHcLQ9ZTZEtKHy5ZQ8w9ek=; b=GcdeXpOW1M+VmVg9c0JQg4HlZg/uwJoXuOTLpVx+Oaud8jbxY4WBuubA+dr9+li0dVCuCH5ciLFVFrD5l8jbuZQDExoMZw6X2Fbbt5asDiynQD9ed5Kv65CpIxvWQK3kK+kTbtzfas5eco2JWd3IsYfbJQUF5iH2HmH1X8f99UPq8RYUnDkCL2ZR7gYCanRVnjNVJpBbWzL5FTAomyhZP+7Sn43ZMVgdHcCmMzINTso9hWth5o+PIMitjpFJ0tLLG2ga01psFnqWcV0T+11yHIEsfif7akcFL1WYLhhJrEMw6oBoDuUR8xQcMbyxFx10wmDYELKeAHlJRKjQvXp5PA== 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 LV9PR12MB9782.namprd12.prod.outlook.com (2603:10b6:408:2f2::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.11; Wed, 26 Nov 2025 03:50:19 +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.009; Wed, 26 Nov 2025 03:50:19 +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 v3 4/4] mm/huge_memory: fix folio split stats counting Date: Tue, 25 Nov 2025 22:50:08 -0500 Message-ID: <20251126035008.1919461-5-ziy@nvidia.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251126035008.1919461-1-ziy@nvidia.com> References: <20251126035008.1919461-1-ziy@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR05CA0025.namprd05.prod.outlook.com (2603:10b6:208:91::35) 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_|LV9PR12MB9782:EE_ X-MS-Office365-Filtering-Correlation-Id: ee06f07c-8520-49a5-00b8-08de2c9eeb22 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?IDeSUwJ0RANnwmhjgBYr5X2h+EcDIV0OX5otm3jr0sR/3SwdlpAVPlaXoTnY?= =?us-ascii?Q?J5mxt37gkLE31+ABOPQXrIoNdYHaKJalX/ga0V9VXyYriF3kpTUtwQIzqwSc?= =?us-ascii?Q?U5aOhMFKrzqvxZnqPGvWdxfMHDtTfzC/gEXegkDZ1UVnGLrE0EqK6jwOxY0R?= =?us-ascii?Q?3DZa1KiLrMnLM3CumsSOQeYOk9MlIV+idcT0QY6NGlLFaXgN0lBXpqW5/y9J?= =?us-ascii?Q?eH65txO9J9acJI3uZL1wXukNcmLmX3lPCqaule+PsukuBOHcw+tjhzRT9Uo5?= =?us-ascii?Q?itI8JBM2HivwzOqeV0IRC8GIV0S1S5361zfgUnPeOpDFzOz9fPNWDv2NNiET?= =?us-ascii?Q?l3jbB8Y6xtoUWtggk2+cuRsUoel0ZwMD/o1EdJQ353NG2wBU1BO8SLfNM/kf?= =?us-ascii?Q?tdGQOkX5AiY+VW1hd8rS97neqtaWVBgDBDwJj92WNyzG2KFddILZHhKHUHK4?= =?us-ascii?Q?RTTcyY+KivHQ1K9gN8B170uhMQj+7lsNqBsvK/j3HJQ7A/qhCqvwQ0yibUI2?= =?us-ascii?Q?A1rTaz3f/oNcF6Vjj239uwA8fdlDaSa9ejOzrL0rDt/6j0zihDTyZBCwmC3H?= =?us-ascii?Q?atDGp8li4W/nny+1h2Vstk7rXQgVfihzF2BhxjhD7AYQqHhPzyaAT00hNnXz?= =?us-ascii?Q?991jMcKRUv33ZKJ36GFFa5uFXlqlxEYzOVceSJ9Q29MveuPa68XSIzqgTSAN?= =?us-ascii?Q?2Z8T1wNTLd9ONKy4ZSSMaYnyty5vLNwpfUVKEKzn8TAsS870kdUEAI7FCryu?= =?us-ascii?Q?KLfhji4UR3e02CQn/KdLmpKh455z6mbhENO4LQQ7iZaRQ0MXECmU5j5s5/Db?= =?us-ascii?Q?G15IH4rk27MScdfnTrHrxODgmsC3zo/JzCbFuzLlfRP20mrlT4v0WygGUNU+?= =?us-ascii?Q?g4TNb/PpLDIrY4wA+eqyfVhGmFRC4rv3eCXPkZI7l/2NNaL7JBNyasU7jV7s?= =?us-ascii?Q?EY0uBMCy7Hryj3rA+TnEASjxS1l3GYzhFULScVvFZLF4W5oYnRWA8+Cz1CIV?= =?us-ascii?Q?D+6Fm8iisuNkRDT4GMLffijp5NF5qWUoLFYfViAnQB5bkBbJzWZ0TPPYgE6U?= =?us-ascii?Q?sKTStxcobI8+Lgi9sfBXPvmn/99Iwh7ITJMS0g6PPk07stunlFL23hvBzpE9?= =?us-ascii?Q?aT8q7xp39EP+VcJYB4BZPoqvG8oBwuAqmDxHXUwnZpm42yJX+JdnV1CUaY1u?= =?us-ascii?Q?O9vH4mNdpl+bjKqkB7X7bAZ2kmdU2CxFcOqdfdkd34/2SbEsfWOOmvGAf91c?= =?us-ascii?Q?jfnz2czy4QJ+IP4C1XaAHEw5KGuYdJ94qlvYOMNdiYluctmDf2PBNUJFR+6Y?= =?us-ascii?Q?1xWzPNFMp6fSBaZKahclMksF++aa2Kx9MVcE1aKmkohWzob2XdDN9bhFYJlV?= =?us-ascii?Q?7KKMCpDWdNL6VIqVjfS9T39Fhb7I9wsbTuZym0fswj/HRHZiJ+5F+JjMYSyu?= =?us-ascii?Q?EPJJs59lB77lC9zvv3wvjkKGI27glyES?= 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)(366016)(1800799024)(376014)(7416014)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xb5yjV842NeC3MsKQTxlTovK1b5XDnndTQZx3EN6jH28JiJtDbdxpRODpTaH?= =?us-ascii?Q?Lfuj+G3wQGhHNtsP22WwoxH9VzcX1QiJeHa/1f7hruCMQ/YtCBY4o2SeLqV2?= =?us-ascii?Q?+cTpzstab79En/4mCPdSlCZazMr2T+MJiL0TxewESsPLriPgm3a8cNcGsYyg?= =?us-ascii?Q?mt/As5PyBcApP+u6W7rVZkzwCP9QJCJ+mFBAxzDEhvQQfTbfE0XfDg5CqPSy?= =?us-ascii?Q?Yoi+9ern1B0NqurdqPrwclXwczbkY+uA5ykM0qh5HcaPjXrw72ByjWSpOoIm?= =?us-ascii?Q?c2+WhzoQM81YVzbHUE3it49WA0XU1c8mFdk70NnrpsyS7GzW71zkWhSkFV0w?= =?us-ascii?Q?M/fqd0s8x2rY4N1m9HTUW4sMtQ6+0qAEkpPim1XTIZtKPfSeMvh//GLTqrZF?= =?us-ascii?Q?BUMy5prjFRI0ZGXP70CMYMMK5RwYCmQX4/YiC1ACLY+HefSF5p/JTOxDNgCr?= =?us-ascii?Q?FrlwzEmGf7P7yUhFikjUOq1fL6GZLknXEULvIseDlz3AfUaUxJZOUcRn0XnU?= =?us-ascii?Q?svIRLqEnys637zRQSW5YStabSfqt1Bmbh3aA5+PcFCgeOmSjHmQ5ixKIfx3q?= =?us-ascii?Q?DWhhRl1BP85boxJlC94ewk1Sbj5emZ1iMfstY7t0OK5wolDfuHUWor5Bne6b?= =?us-ascii?Q?8N+ZOdD1Lrz0IQzJmAubJ3xp5d2W7TchDwMioKk4Iox0wdtIixGORvDqMI5+?= =?us-ascii?Q?NTtNcpFlq9BeTz9NH0dWdfERO1eY6FAPZr0ZGOy14m0HAburSFiXSFzo9fbL?= =?us-ascii?Q?Fbj10fxllk/BgTAZPJGFUfzUKOKCgxZx2Aw9UfOzA7uexhAKkuETbnHjBEBj?= =?us-ascii?Q?1/K2rBLc2M0OlS8qvZt1vtGiMxP7bZvE/x1r//xK23rLqK4+XaxQpKdMC8oS?= =?us-ascii?Q?YBO7mNywE+b21Ncp4/pAcScH/vJnoJxBEQef31QdYCvJ14/s7yrMT09MSLIv?= =?us-ascii?Q?2uslUjkuy0JpHVYdw14jEcOJmNL6cbzlXzyXm/SESUTW3XbPzZFFShNh+KbD?= =?us-ascii?Q?wPeAd98hR7awVL755Ti/Mwpe1skY+FsNAyBGZxzgG8Om68xV9SAeP1OQztW4?= =?us-ascii?Q?7uphglFKOsPh3lUB5aBnMKL2wquGUtHVjmGw/cU75xpx7AYLSh+u0WPjup7H?= =?us-ascii?Q?JyK44GUyWdtHG8gRkQ+Sz8LQh06RyBKEB7TYRutiO6KgG3TL6jtH1ELrhuc3?= =?us-ascii?Q?xlg8hIaxapyuJbqfpWtjSYvi6xbXqQCIoA54yE/6FdrBCE6ZkbzSLeeMHR8w?= =?us-ascii?Q?vHp5afi18idAg/5RgP1H7uNDURew3lVCLvkIRTU9axeeB1Q3ksJYnxtVxkRM?= =?us-ascii?Q?TXKn1n21TEcQ+x19k0BttWRjaQLROFzOaW/Bm74xJllGOSHiGUuFWYZbmM+V?= =?us-ascii?Q?3YoSktQ8Yl2VN+Pn5av+wxS+I3zmEcylTYMzt66sqj/+jwihatlpOoG2MPW/?= =?us-ascii?Q?eorAS+Nj6Jb5aVYuOwrq5ro7pSp+UUnDMSQ9yGpYGhQFcy0d6ml6obpPUFiR?= =?us-ascii?Q?WHolIsDx2orF8zC0IGHLWypYZCGuBVBGXouEsMSeklF76AVtA0hYFMrxkPLu?= =?us-ascii?Q?oGmQUuA1I4TS4YKehXC8QgOlQHbjzDwN6tS4XHQo?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ee06f07c-8520-49a5-00b8-08de2c9eeb22 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2025 03:50:19.5459 (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: fupJ9/3meQRK9ihrUJJXJAcFY37uxVt4Y95lV1qdrwXNDvvd4BzNqJyWHMFt7oxf X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV9PR12MB9782 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 3d2396bf5763..9e984608da81 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3944,16 +3944,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