From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012003.outbound.protection.outlook.com [52.101.53.3]) (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 D9C40335066 for ; Mon, 24 Nov 2025 22:14:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.3 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764022475; cv=fail; b=cqayZQ5kOg3floPSic7fHrmoNJTseos97X1HkgPp9mqHv6+yLckFvV25ZkYH+Zlaj0PaUFID7MZL6WB/qT5wSJi3K7c7//IvuhBZ6TKJl1Yw7IRKJfKTKQqr+l2yJfmN7ztUe2zUWMjBPCMmzhDKVoQ6httAml/PG3QeGnokM+E= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764022475; c=relaxed/simple; bh=hHKxaouSw699oEI9S7RlMKcKdkh8IxIq2Sf1r+qA6hM=; h=Message-ID:Date:Subject:To:Cc:References:From:In-Reply-To: Content-Type:MIME-Version; b=M2gVbfB6JZvPYmEJt6i4L6kZ43PAVuh/8A+7JhsPRfEJoDKIY9gjQ3EZ5oJc++WTeguP3rDp66hN2Oiad/cPqPURaFxa6gelPNcjr9HxiZ35gVDwwI/+0TX3CUfhgNkMi9PZpKUG0foWa4+6iNAHDREPS12fRQ13BLbyHhiGJV8= 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=SZIKEBcl; arc=fail smtp.client-ip=52.101.53.3 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="SZIKEBcl" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vhOkKWCWv1m2G/CfhaJHbjVcpvKsd6pWbOOUGI0wn9TXY2QjpI7MvTvd/JdN0Lu+UoBgFh4b2nVA4B/Aj1mrWON+rPYQdRqxIKi0l8j5x+GpP4em6SP9L7Ueny+KIKJDBUu1G1h+hkqwdRbkcmGKVee0/JoCfvpJBc+hYN0VJ9EiiV9x8pZvjXKpFoPQsOHawLREM7UvgkSsta6JqpNr3SQYhTFENks2+/zdqZ3y0NVI8EPZ9La1bH4W4Q4zrzrYaObqGTNscYpFB9yM5450+8OpZ7GXWy2KuQ0SQpxQYMEDuBn6atS/b8OO+PnDBj9R8SZxyX4aytDLcciViB3pKQ== 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=2zX8Z9gfR9t5iDfSFji/391ATdoJJGfmw8idKu0a8Dw=; b=tdB+jxQD3Ro2NL6u7AUt+ytGp6wcRe+URcClnlohkKZ6O10uHqkqvaOPxe4fsn1D7a/7MnLnDTyraPz94/J6X/7P7d4/ClyJcpHEC2lTbb8IU7JAsk0yWlbLA2czvP75wv4101RT0W75hEpVqTgiwTakDTAlbydV8gpot5LTTyYly8D8jX7t3fnwk4BHSddkZPFz8GR5JvR96hGTXTMFtZUitLSXjRqnqjBUAGW4Q68CrK0yJc3stWwlDm/UsEz6/yIhbX9U20VYwv2Vj5x36f9rsKmQGSo9pwEt391+GQuLhQNxQez1vP3rF6aDWq+jX+Qk2LXG8x4IBhdHX45WYg== 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=2zX8Z9gfR9t5iDfSFji/391ATdoJJGfmw8idKu0a8Dw=; b=SZIKEBclYhx5mfHKDfd8Z0UZRoRZM1F7Sq/FcKWrd/BeMZlCTpRhnT4AzfXFKpRljdQm2pil40Xt5nw7NM47EjgskZjHVNsKw/Ic+3xYKC0PUVrtLycm1N7zFMcaMlbQxoLqhGX1EDoKvY8NiXFSVc+Tqr2uh9CiZ1Yyz+MAkfth10RIKpWPq0v9x1eRzSytCHasKeGGZa3CjA1a9S05NSJa9yvJh1JLLVnQ0VavFLDdke+2Z8cXgqHI7eIKKbCC2iWXgs+kMUPqm9BP5233V1eHOmiC/lwkYd8mkU3WRb295dckH2Uh6xIBbSLR1EU6CiTj5QMTzSGpXiCHyxBaMw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from PH8PR12MB7277.namprd12.prod.outlook.com (2603:10b6:510:223::13) by SJ2PR12MB7865.namprd12.prod.outlook.com (2603:10b6:a03:4cc::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Mon, 24 Nov 2025 22:14:28 +0000 Received: from PH8PR12MB7277.namprd12.prod.outlook.com ([fe80::3a4:70ea:ff05:1251]) by PH8PR12MB7277.namprd12.prod.outlook.com ([fe80::3a4:70ea:ff05:1251%7]) with mapi id 15.20.9343.011; Mon, 24 Nov 2025 22:14:28 +0000 Message-ID: <51675d77-9453-43cc-bfda-f21a2edfeace@nvidia.com> Date: Tue, 25 Nov 2025 09:14:21 +1100 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 2/4] mm/huge_memory: replace can_split_folio() with direct refcount calculation To: Zi Yan , David Hildenbrand , Lorenzo Stoakes Cc: Andrew Morton , Baolin Wang , "Liam R. Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lance Yang , Miaohe Lin , Naoya Horiguchi , Wei Yang , linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20251122025529.1562592-1-ziy@nvidia.com> <20251122025529.1562592-3-ziy@nvidia.com> Content-Language: en-US From: Balbir Singh In-Reply-To: <20251122025529.1562592-3-ziy@nvidia.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: BYAPR04CA0018.namprd04.prod.outlook.com (2603:10b6:a03:40::31) To PH8PR12MB7277.namprd12.prod.outlook.com (2603:10b6:510:223::13) 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: PH8PR12MB7277:EE_|SJ2PR12MB7865:EE_ X-MS-Office365-Filtering-Correlation-Id: 0fb15002-0217-4419-ac0c-08de2ba6d568 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|10070799003|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?utf-8?B?RUxVeEl1aWJGY1BEVFRvSllVbllHSjdxQk1HNzYxSmptZGJFVWRaWnNOcktj?= =?utf-8?B?RTdWd1BHNSsvdmRsVTRhaDRxZlVYS0VaM2NRWXFJQlBIbzJ0MHk3TzU5K25N?= =?utf-8?B?TFp0ZmRlRVlSa3RuaW5ESHhTWS9qYjdmYzREQTNZamIrL0R2TGo5NTdqQzQz?= =?utf-8?B?R1JMV1lpbkE0NDI2NWFOYWU1N0Y2MjRPSEtSRTNwOTg0dTFyeXNqdStBSDhH?= =?utf-8?B?WVFTajU1YTZ5TE8zRkNwQVRCRkp0dTl4ZFlVejV2djRyYnhjM0hlMnl0OGtI?= =?utf-8?B?Mm1SNTk5cVYyY3pBSTJVbXZrcHU4VGw2REgzeE1SZmNnZitwYVRzajI1cWxL?= =?utf-8?B?WFB5OXRBOUg1cWhVZHkveWJydVZKRUo0MTVycVd3RHE2ZDlWNVRFNldrVWFC?= =?utf-8?B?ZDdQSDZPeUptRkJERjhkUmhRaGNJaUFLdE04QTRGZmIwdHY1WWUraHZwd2Ur?= =?utf-8?B?WmlMYnNGNFFLNzVSVG95NTlPT1gvZFUzRFlmWEo1RVFyQm9kTEx6UHJ6Ym9o?= =?utf-8?B?RHBQU0dEZjNocWRYaCtwZXh5MGtEQ3lmTmNaMmVpd0JGWVJXUzRkMUZYUnF2?= =?utf-8?B?bGtiTUk2OXFZcmcvR1VkTkZmTjgxRE4zNmxOdkRPaXFuYnY2elRzQ3pUbC84?= =?utf-8?B?NkltY2d2RWJ2T1lHRi9xSjFYRjJGN25Wc2FaYWM4cGlmRUljQWFyeEhCUDYy?= =?utf-8?B?UFlUeVkzWG9xRzRRL2FFRjYzQm5BS0FyTUxrcG5KUUlxRGlrWDBHT001U0kr?= =?utf-8?B?eUJQQklET0VrZWtUNEpvNEpTVE1LUG5Xdjk5djVubEYwbDBhYzFwSFFvZStE?= =?utf-8?B?Z1BwdnFiVGw3VkNNRUpxNWUxNHZUNFBZVTVUNldFMWtmK2FieWtLS2lEVGlT?= =?utf-8?B?bDNMUHhsWU94UnJnbmVCQ2ZIN1NYQks3YlVqdmJNNjJyUllGQ0JjZDd4K1JT?= =?utf-8?B?NmtrUmFrVGI1QUtMV3I0cUJ3MVFxQmtpdGl1Z1gxRzdhMERNbXQxRWdoU2FC?= =?utf-8?B?VGp2MndOQkZUSmRJa2lTK3pOTVRRSmtnT0pZd0ZXbDA4M3hHVDF4U3A3Yy9F?= =?utf-8?B?SWFuck9qTDZwdng4aHdOL1I2bDkxWFVPUjQvVXZRRDFvSEl6b1lhN1JxbDZR?= =?utf-8?B?L1l5akN0ZElmbnBKb0xlKzRrV0I0RHRES3pEQzJkTEEzcHNKb1RMd21FTmo5?= =?utf-8?B?TVhjVDBySlpGNlpoVEpXL09LMzdpZDducVdEWkdFWHA2Wkp5RkFMc2xBaHQx?= =?utf-8?B?a2l5RGhValRwRGYvNER2SW1icTFOKytIb1ZrdUs0YVpIZXlDZ21sN2ZxZkVv?= =?utf-8?B?ZjdQNk9mcFltOTVkUXF3eWo2bkJ3OVJEb0t6ajBOQ1RzdDduOGpnSW5JTUp2?= =?utf-8?B?cGZhWDRiNVI2OTZFbXgrL01jdU1HNDdJbG9LdCsyNXU5empRaFlvNzV3ZjBu?= =?utf-8?B?aFlJWlBLVVF1VjVKNW9vL1Y2RHNZVzJXcFFodlBFWkxTc0RUN1ExbkpwNHVR?= =?utf-8?B?QU1pbVFDaGhqeitzNTAvVDNmTExhUVFQTHZoVjB4SlU2TmxTejYvZWJlWllG?= =?utf-8?B?UFNhNXE5L1BVOVhGOU1pVVV3dGFpQmJIYjIrY3MrQXBWeUJJZzV3UWk3Uk9o?= =?utf-8?B?RW1Rc0pRcERLMVRSMG03dEZPaVZHZGE3UXpsTlF4V1R5eGM3ZFdnVzBGTVlG?= =?utf-8?B?c2FMM0orblRpZE1LZUlxSUlXMFpPYUcrRW1NVFN6VS94YnNoMzB6d2M1SGdl?= =?utf-8?B?KzM3VWw2bmJzRWNSWmhKOE9aN01VUjNSUlkyT1c3WURaa2ZLbFpEaVE5SlFS?= =?utf-8?B?czZvRThlb1JsbjZyNURVQ2xCWE8vR0J4UEllYS9MbDI0eXUxY2R5bEVlWUNN?= =?utf-8?B?ajVPUGNCQkpoOEZMVktySFdtS2lISVRlUG1IKzVOTzRBem5qK2IzNTlGcmxQ?= =?utf-8?Q?w4epKrQpZwuIoZtCXktzyfKYDMZ9wnd7?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR12MB7277.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(10070799003)(366016)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dWo2N3VnOWYvcVg3cE5WYmJ1MmxJdkV1eTE1ZHFIaGNZM2R2dXQ3K0JlN2E2?= =?utf-8?B?bnVSL0VQNllSVkFNREJCTVdMdVk4NnRrSVdESkJMSG1MdHcrTVZWcjk4SnpE?= =?utf-8?B?UzN4TVpEV09FZUNVckVZZHhVc1NMY0ZOTjJzZmN1VzhLbStoa09KSlRUSk5o?= =?utf-8?B?NmVSMTM2b25TMHlPQnEwR3luN0Y3OG1jNURIRTVVaSsvdUhPZ2hkS21IZ2RM?= =?utf-8?B?aGY1N1JidW94bjhhUTkrREZSTmNqaHFiMk1NSWFJVGdXK3d6OXRmT1pTVGVD?= =?utf-8?B?M1ZHMVJ0b2QrMGlGeVpFT1l5dHBmUmxDdDBSMUJIUVJvSEcyUzVFL2Q4emo5?= =?utf-8?B?TTVGVk4wTHk5ZG40b0EyRURJMG1iVitZdnAwWW1nNk9UempBVHc1Q2lPaC9u?= =?utf-8?B?UHQ0UjY2M1dDQVNTTGM1Y0NaNlphV1lWd3UrQXdZZVRSZVNQd0ZQbzNQdnYv?= =?utf-8?B?bUtVMWQ3bWRadXpQNWU2QVg0MHc3NHJFTU04VjY2eXFUbWRwdStkNW5xQTQ2?= =?utf-8?B?RUlBZmVjQ3NYSDJuaHRMVDZJMjg0UnhjZENRV2hUT01xQlEveW1EaVJ4NnQz?= =?utf-8?B?emVpT05wMlNOZDBBMXJiNkI4eUllTnlRbVJZeTZjaWdBQ0pGU3lxK2wvWVNR?= =?utf-8?B?UE5QNGJqdC80YWxQWUd2Q20yT3llZElJaDN6NkNTSFE1VkZYWEhBenBHOHFD?= =?utf-8?B?eHVIb0o0SGJ4aTl3d1RDdnE1ckRNME1LaE0vb3FCNjcvd0pnSkFkTnR4MXBT?= =?utf-8?B?b01xUUtKL1FveGJWMUxSZkIwcXNBSlJlSFQyN0NPaWlsa3IrbWdkbTllOGhB?= =?utf-8?B?azBhNERUb0RDM0ZETE11K3YzZ3lER2FuaC9URWsvcjRqN2pTZjlWNjJYakZq?= =?utf-8?B?bHZENDc1V0l0eU16Ymp6V0FCckhmRWUrTG9vNHllOW04NGF3Z2hTd29pQ1hw?= =?utf-8?B?OVFqMFppbTJqTVg0VFNvRXkzaDgyTmYrV3RkcEJFOTJjMjJJNVRjZE5QaDB3?= =?utf-8?B?Y2UvR3BjaGU4Y1UvTjN0YTNwRVNSdFVmSE1QVFJDaTdQWTZOZk9wdkxWbGRI?= =?utf-8?B?RytoV3VmOTVZK21LdHRNVCswaTJSZ0ZDSytNamp2RUVPL2ZldzM3WmxEWWJr?= =?utf-8?B?WkNKa1VmY3RGamY1MGpHb2FxR09EZ29UdmhkSEZZYkttYzN5SW9yOW1Kb1h5?= =?utf-8?B?anVLRC8yNDNLaDlrWWdvUk02bTFrRVNuM3U4Y21wVjJ1SCs5b21FT215ZXRP?= =?utf-8?B?NTlpVHRQU3hHTHE0MVB3U1ZUM2pCY24wWjdtUENTOFRiMFFtS3BEWGZBeW5B?= =?utf-8?B?TmM3WnVUdzNNa0VMeW1ZOWM2b0RUQjBaa0ZRVVV0WmxLSUtKUXRPRklKWDdi?= =?utf-8?B?RHk4Nk1MdExxQzQyNXE0VU9lOCtJb2pqZ2FZaEVLWEhlN1dwK081d2E3c09n?= =?utf-8?B?YUo1cnYzdlU5MmxtbnpJaDN1S256UGRISWJDWHR1OTVxZlBZVmxJdUI0YzhM?= =?utf-8?B?clJxNlh4WUlieFdZSGZiZDRDSW1UakdiOVd2UjlhVVY4YllaOXFLZkZzWnM0?= =?utf-8?B?NlpoQkJHUjNEalE2L21UWnY5TTlKSzlTNEY3SGhodnBTTU5ZYTM3YzlsRUJa?= =?utf-8?B?YTJQc2VrUTRncjFpUHVWSEZpTjZCRmQ3a0ZXdE9qNkRBaXZwRm5ML3c3Y0VC?= =?utf-8?B?Q3ZMQXVvNGhkNGJHNHhRWmpuZDB3aXFrQzBrendyNldyUUNsQmpSOTFRYk5C?= =?utf-8?B?OEpGaUplZG9uWjAyK1pvOEFiMlhMVVVyTHBTNUVJb1JRZGFaaG9xclRWU3BO?= =?utf-8?B?K0FXSGFiWFM0STdKTGZLRkFTZlBmMG9wbUJ3d09IdUZ6cmRyaHI3MWdoQ2Rk?= =?utf-8?B?QkZyL1ptZ1lvWGk1enRUdTNUSVhvTjkxR2pWYlNtVStsWEVzekdacWMzMkZp?= =?utf-8?B?RjhTWFludHVNOHVrSUJKTXY3SE9KMEhPaXpUYk1pb2xaTU9ZaDQ0Rnk3VnZS?= =?utf-8?B?UFFXUnZMWGMzYjZrQXQ3bTh6eFhOa0dzZmtzM3doMTRSbFJON25kbzA3WlNJ?= =?utf-8?B?U2RQVWRSL1JxcEpwSlg4b3kxSllzQk1NMW9xRmtiUnppMUxlRzd1dE12UE9H?= =?utf-8?B?TTJnOGJQL0dnUFRhKzk5OFlLdW9HeWw3QzVZNXRFU2VtSExXd2VtYXo0cXU1?= =?utf-8?Q?6MinqyZ987h2YDmkPby33NeserxMrmKKSf3+VuRqXnSL?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0fb15002-0217-4419-ac0c-08de2ba6d568 X-MS-Exchange-CrossTenant-AuthSource: PH8PR12MB7277.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Nov 2025 22:14:27.9533 (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: E7feMcEDcbyFnSurn6D/vdg6eoDt9BM53q7s8By1679nUpo8Aho8k59w3shx0HUqDTgbhyQ8iokfBJdG8qAXbQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB7865 On 11/22/25 13:55, Zi Yan wrote: > 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() != folio_ref_count() - 1. For the extra_pins > used by folio_ref_freeze(), add folio_cache_references() to calculate it. > > Suggested-by: David Hildenbrand (Red Hat) > Signed-off-by: Zi Yan > --- > include/linux/huge_mm.h | 1 - > mm/huge_memory.c | 43 ++++++++++++++++------------------------- > mm/vmscan.c | 3 ++- > 3 files changed, 19 insertions(+), 28 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 97686fb46e30..1ecaeccf39c9 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -369,7 +369,6 @@ enum split_type { > SPLIT_TYPE_NON_UNIFORM, > }; > > -bool can_split_folio(struct folio *folio, int caller_pins, int *pextra_pins); > int __split_huge_page_to_list_to_order(struct page *page, struct list_head *list, > unsigned int new_order); > int folio_split_unmapped(struct folio *folio, unsigned int new_order); > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index c1f1055165dd..6c821c1c0ac3 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -3455,23 +3455,6 @@ static void lru_add_split_folio(struct folio *folio, struct folio *new_folio, > } > } > > -/* Racy check whether the huge page can be split */ > -bool can_split_folio(struct folio *folio, int caller_pins, int *pextra_pins) > -{ > - int extra_pins; > - > - /* Additional pins from page cache */ > - if (folio_test_anon(folio)) > - extra_pins = folio_test_swapcache(folio) ? > - folio_nr_pages(folio) : 0; > - else > - extra_pins = folio_nr_pages(folio); > - if (pextra_pins) > - *pextra_pins = extra_pins; > - return folio_mapcount(folio) == folio_ref_count(folio) - extra_pins - > - caller_pins; > -} > - > static bool page_range_has_hwpoisoned(struct page *page, long nr_pages) > { > for (; nr_pages; page++, nr_pages--) > @@ -3776,17 +3759,26 @@ int folio_check_splittable(struct folio *folio, unsigned int new_order, > return 0; > } > > +/* Number of folio references from the pagecache or the swapcache. */ > +static unsigned int folio_cache_references(const struct folio *folio) folio_cache_ref_count? > +{ > + if (folio_test_anon(folio) && !folio_test_swapcache(folio)) > + return 0; > + return folio_nr_pages(folio); > +} > + Does this belong to include/linux/mm.h with the other helpers? > 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 = folio_next(folio); > struct folio *new_folio, *next; > int old_order = folio_order(folio); > int ret = 0; > struct deferred_split *ds_queue; > + int extra_pins = folio_cache_references(folio); > > VM_WARN_ON_ONCE(!mapping && end); > /* Prevent deferred_split_scan() touching ->_refcount */ > @@ -3956,7 +3948,7 @@ static int __folio_split(struct folio *folio, unsigned int new_order, > struct folio *new_folio, *next; > int nr_shmem_dropped = 0; > int remap_flags = 0; > - int extra_pins, ret; > + int ret; > pgoff_t end = 0; > > VM_WARN_ON_ONCE_FOLIO(!folio_test_locked(folio), folio); > @@ -4036,7 +4028,7 @@ static int __folio_split(struct folio *folio, unsigned 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) != folio_ref_count(folio) - 1) { > ret = -EAGAIN; > goto out_unlock; > } > @@ -4059,8 +4051,7 @@ static int __folio_split(struct folio *folio, unsigned int new_order, > } > > ret = __folio_freeze_and_split_unmapped(folio, new_order, split_at, &xas, mapping, > - true, list, split_type, end, &nr_shmem_dropped, > - extra_pins); > + true, list, split_type, end, &nr_shmem_dropped); > fail: > if (mapping) > xas_unlock(&xas); > @@ -4134,20 +4125,20 @@ static int __folio_split(struct folio *folio, unsigned int new_order, > */ > int folio_split_unmapped(struct folio *folio, unsigned int new_order) > { > - int extra_pins, ret = 0; > + int ret = 0; > > 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); > > - if (!can_split_folio(folio, 1, &extra_pins)) > + if (folio_expected_ref_count(folio) != folio_ref_count(folio) - 1) > return -EAGAIN; > > local_irq_disable(); > ret = __folio_freeze_and_split_unmapped(folio, new_order, &folio->page, NULL, > NULL, false, NULL, SPLIT_TYPE_UNIFORM, > - 0, NULL, extra_pins); > + 0, NULL); > local_irq_enable(); > return ret; > } > @@ -4640,7 +4631,7 @@ static int split_huge_pages_pid(int pid, unsigned long 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) != folio_ref_count(folio)) > goto next; > > 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_head *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) != > + folio_ref_count(folio) - 1) > goto activate_locked; > /* > * Split partially mapped folios right away. Otherwise, LGTM Acked-by: Balbir Singh