From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013017.outbound.protection.outlook.com [40.107.201.17]) (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 3D6543EDABE for ; Fri, 6 Mar 2026 16:26:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.17 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772814380; cv=fail; b=aCBV4Xnx3wOb52WOhpFUcrHxAx+jamcjRVaZf3oiH4riVSA9Y6anTaTcEBM03Ji7aygeWbINmuKdWgiyOaF/5YRa5jIXXN4bPGyZ9jNDeXU/CKF/IkckR8DcWpwOrk19mK0g6NhqFjvDXPVMyOd1BBv14s1VYs09ybRpI88H9sQ= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772814380; c=relaxed/simple; bh=Yq4wmxcwK/RHUTYCvDdiJtxLpcAoK1zkRZqEGHdSJJ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=s5CI+usdLCO81nvB5F4Ch6I3v3DEDAOpcfhctkyKgXI2zORj6+tPFLbQCzt/DsUmEdFU9N95WMSknn5HLCi9Ui724ghVwJgJM/WGI2QavUUHe2ky5zVRxTJp9lCCnaOjVU4105h3rSMfXT1xzgLzTPV0tJkvkpiJG2RyJ6oPqS0= 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=XR+4g7IC; arc=fail smtp.client-ip=40.107.201.17 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="XR+4g7IC" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UnalrTr94hkRFlnmeTNdDUTv865O5Pcmh3x6yWKKnc98FDZcD6+Cdm5GeuS1UrxhRCrCR3tBOEJ2UUxmlj9iG+9J3KdFtzkTgLcDYWGgHsLyravzuADPBsI/KT5rFUBAp08Iky3kWlNNiDinjRnZmJikjKY9b+EPcLUKYxd+V7Nit332FGnOMjvj0WR6ftLwZ1m3gLsRQ0iyvMNaO0UwWHt7pYyFpqBGqZht/UnBaS+bAeQKP49L+nXBa5Eq9vrf3Tuv9pPjScxrnpBE4Y+VNL4CfGUVcf7hnj9AfCAxvUORaAbPlqArqKyfblyySKBCschUUm8eMcmlQnNCfjeBnA== 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=WSWclaA1D5bPTMzMz3Zn9A6EvD/0u/4BSKisbm/Xdbc=; b=NrsoLeVm8QpT7HWSzNj+neZJKG7W5GjruYETlfuLJjmg6Bja6i1oRFniqtPVyNQBDwvcLPe/jZSj5JBzVdl77VsHDkWzG4dJDtuD44h7c+Y9zB594yF4Dz2LzMBx8LumX+A3bxHwALKyk+dX8RKxcze/P0ozMop8H6PqBscvvJssj4nHsfaJCbl0w2G70AZvwsPEkQvFyWKF05WOhJF/cQTtESREYJz8ThoJsyWXz0XSKfSRKR4yZq+wY/7p6nwOR4D3HWGHxxTOjQdm1bP/AY6q4j+1FP8rpkMxq5Y43eWsC/iWbn99Bxv6bAZjB0O7bagyAzvGt7PQBhywEavhvA== 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=WSWclaA1D5bPTMzMz3Zn9A6EvD/0u/4BSKisbm/Xdbc=; b=XR+4g7IC8tOoNV04oi0Ns4Un03XVATJdCd+/hYVoPpGr6szzMaJ/3c1XN87LR3izbaJEwMaeRjnFpADo3klqoLUnTEspP59mfYs9H6458XVbhWTJvaFvsHnIRvpDAQyH22tuEPCanc0TKdtAYmq5PpcHEbf12VxacqylBCmW/z2T5T65QNSVsN77MExnwDnhicd8/3x3DGKsP33n6uZLgtYLgGK4O6iqahJ2FLBXCcdV+s4lvwPT0xrUxQ/0ieYTvuuh1FpNHZloY6zADDc4/A3XaOysT7YW+ToSQ/vNLPq+tFFvWUTTDjsPmLFhm5BShDt2VnmINE7zb0zBXL+mmQ== 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 SJ5PPF3487F9737.namprd12.prod.outlook.com (2603:10b6:a0f:fc02::990) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.19; Fri, 6 Mar 2026 16:26:12 +0000 Received: from DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::f01d:73d2:2dda:c7b2]) by DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::f01d:73d2:2dda:c7b2%4]) with mapi id 15.20.9654.022; Fri, 6 Mar 2026 16:26:12 +0000 From: Zi Yan To: Usama Arif Cc: "David Hildenbrand (Arm)" , Andrew Morton , npache@redhat.com, linux-mm@kvack.org, matthew.brost@intel.com, joshua.hahnjy@gmail.com, hannes@cmpxchg.org, rakie.kim@sk.com, byungchul@sk.com, gourry@gourry.net, ying.huang@linux.alibaba.com, apopple@nvidia.com, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: Re: [PATCH] mm: migrate: requeue destination folio on deferred split queue Date: Fri, 06 Mar 2026 11:26:05 -0500 X-Mailer: MailMate (2.0r6290) Message-ID: In-Reply-To: <28e48b47-f215-4e4a-b55a-01dbf293ff35@linux.dev> References: <20260306133556.2051251-1-usama.arif@linux.dev> <64051a59-680f-40ae-b291-b884aeb7c77b@linux.dev> <993B37FF-29E1-41F5-A1E8-F38B9CD24478@nvidia.com> <28e48b47-f215-4e4a-b55a-01dbf293ff35@linux.dev> Content-Type: text/plain Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BYAPR11CA0082.namprd11.prod.outlook.com (2603:10b6:a03:f4::23) 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_|SJ5PPF3487F9737:EE_ X-MS-Office365-Filtering-Correlation-Id: 3803b617-3391-44b9-5dd2-08de7b9d1498 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|366016|376014|7053199007; X-Microsoft-Antispam-Message-Info: YhDDoxr8VuaQq57EQ8UL9BL+HUoKC8K/qqwEG+fagXgGXmHT695j78rTOJlVcE7Azbc2Z7L9yLFcHAwnvS6REpvXuxKot+AlJNcNQFsnvlqYblC9T1e3xqbEmxO2Vm2iYxYdwrdxnALEWuPuYx+bTuVNk0U5amYNuwydB2/XhXVwuvU/7W4pqciYBT2Nj21SLvFhZBgyBzEN9Fjik5SVNmp+UnenVb3V/zXfwmnjt9qi0kqvgLD4da9C64JWG0CX2QZV99JTzf7bUYNvGqjmUCrLYw1+U6ZCi5ztY5m0RgOpmHvOTc6uvv+bOeU5+OUgUvdi/buKh9BON9amaRtL+4VyliMf3ROhIxadEPEeC9Qh/LeRJ3m6KrThHjZd1tduE7EiC1qurGn9er6GSYWzYH2NX3+pRmLfXIPonte76OPXbHYvVF6i86oVIQkS+cmlDNtYGYfzOeZiplyaGuRKawJNa2hY7D6XMv2wTbYSwr2r/00OA4EBUoMMvkwa8RR3NQxZbmfJWrEk1Z+deUPD5tLEQniPYnsTQns2DZAyuIDXay05JkmheTTIRZkLSdo7K6GdcUMZw0+pPruqeFgbwTUZO1F1ag67j2pSNwgu92SzXsrvfNcJltFFQ7V7BB7jheNcnoyxyu2F/wWFkv+N3skm4blkRyfejzU7tsfQLEA3XJxc6Q4VMFk2CP7xWZ4OyqEu6C1vJQppQpIPSPB0YugOHq5Pjo5lbnvaZ7a2zlk= 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)(7416014)(366016)(376014)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?h8HuLas9Rr2m1OY+p7bVRX3L11XXSL6usbE/WNWYVHJ0QGl6uUNsxoSaOe04?= =?us-ascii?Q?Qgb654zOrJbTILTeHWzYVYoNm5VX2ViLmk7dpyhWvgj2/TpIpTCV1vh2F49Q?= =?us-ascii?Q?a9oMd8RpG1eMzpLSfLPZXje5isZKVxSRpmuCP/+J4MLg/dq2M9S7aruslJT3?= =?us-ascii?Q?w11ApP/Cbyt2LHKcPW2INxmcFPptJIDBS7Ggl0T2us7fWfdmf0H9xNCzoqqU?= =?us-ascii?Q?bkKGd1afA6udIeGIR0RQL2mafslnugJ7MkIZrvytqCjLRESt73lpAfg7zzbi?= =?us-ascii?Q?5iFRv8q35pniBjOdCjS6OoMJhid58NEkjhlslH4FKt/UTWxZEq5nKDb3DdDX?= =?us-ascii?Q?bo0lIGJTbxfrEGO2BrfetTzsnCxH9iNcwuOSDi9Kr3rWHZHmyFWZG5SaWsBE?= =?us-ascii?Q?bk7ecU60FLbDS3q6CweVtKKkjOz4ZqFLpRNm/GwFyNqUS6T7CnvO6JU4RP/g?= =?us-ascii?Q?LZu4s7BV1F3K8mofdHqXSfORC6+Dif4WqAKy2ofUiIgXy2kBfxTSGUedgX1h?= =?us-ascii?Q?F02rZSkwQ5bjcyu0mLQLHBsIQYong3YYj3+FSwqa8s7U+wa9v/u3ZQtQFekb?= =?us-ascii?Q?1xMpbbJAORh2yrSo6/hmfoC6AlE9vYLV/zMnjfwv3sGAO8KQ28CWXPxHhThe?= =?us-ascii?Q?nnowkt1skXP1+1J/h+PaBEXMuzCiQjKiGWOB+0/ZI2kn4vITxe/VXdJayAvS?= =?us-ascii?Q?95Elr3aymEjjErPywBaXov4df1T72ZmRU+B0h9OmbJ5NR2k0VyCuUcGhe6bK?= =?us-ascii?Q?6Gu678M1pkBsix7QFTGHoHzn+OzwGEO/RboyhZn7l+q+Z/PvZ8xqgkH9wsog?= =?us-ascii?Q?+DqIPqlLcnU6VBndpc7rXtRdlIZ1pY+d4TFinUQoH26HDjIBQIC8k/KJUNR7?= =?us-ascii?Q?TOLnp49Wo0ZxwlIm3nKM4ne6OiBCjl8Ssas9YEwhAbIP5JypX9B2K0FHtQ0I?= =?us-ascii?Q?BdJ6oViJ34ABOAqVNLtblnw7JE1gV0bUPYub8k25GTrV5h7FTbiyNJwjluj0?= =?us-ascii?Q?UslvGwKFmC5cNbHXUyHYitJZCEUsOTDgQQRLWAI8iootkDrKu/59O8LzgXMA?= =?us-ascii?Q?1Hu12QFJvX26rmGfnyf+LGgvDMGhRD3P2XogG3Q62LknEQWU1Je0vXozJL3s?= =?us-ascii?Q?I41OkeOKmZVdS/vEZlvFOcpOBSv0Husknv5IxGu+E+A21TiPs/xcf/RO3WRO?= =?us-ascii?Q?f3jRW6yhFn4VzJear20emzCp5xBYTeS8Hwg0FdzTih4jzLei/YuVTqbemTXA?= =?us-ascii?Q?RlUs2bhjEFYDs7PTJGjGIoL7g/HmMcrU2SsPDR1FHkPMvwiRWDONexuzYlV2?= =?us-ascii?Q?KpEp3l+BfBwfqwZ2T4izrdysctUXZeLvpS/zHxRkmVZSQB7JbXYAoiU6TCIT?= =?us-ascii?Q?JtB4mji9OSJ3fyMGs93/47b8LHPOS8eK6XEAjtE1gRw0HjpcTiZ4Bwtw4YUz?= =?us-ascii?Q?e/xjgG9rrP/YBUIcw9EDYGXYz0//u7txFpIyJ3tMk8lJ9eViEBKBr+dtAZPa?= =?us-ascii?Q?SOEYNbOwTdK3T46aK0SN3rq4fTeauiLjI8+/A3QxCzqeiCeoGh9Fn+z2Vgls?= =?us-ascii?Q?SuwdPmkCb7tJmWR3WJDvcu89wZeykpDUg6Q1mP8hYqJ29xLmYFDZSTMqmKQq?= =?us-ascii?Q?jVAJUziv9w3PnOT9ynbZGJBGUPmi4opodOxW0E97gEBM2fqLTPZ00I1MKPGd?= =?us-ascii?Q?LsGD20dIXVPNtzey0oED1JWbyU2ITLO4F2w7k7ki7R34EGb/?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3803b617-3391-44b9-5dd2-08de7b9d1498 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 16:26:12.0644 (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: bqngL2z66MLifZJXpcfzvWXuysKqojjq3IbhWardk5g3qysziBVkE7BBHw5q/irP X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ5PPF3487F9737 On 6 Mar 2026, at 11:15, Usama Arif wrote: > On 06/03/2026 14:46, Zi Yan wrote: >> On 6 Mar 2026, at 9:12, Usama Arif wrote: >> >>> On 06/03/2026 13:49, David Hildenbrand (Arm) wrote: >>>> On 3/6/26 14:35, Usama Arif wrote: >>>>> During folio migration, __folio_migrate_mapping() removes the sourc= e >>>>> folio from the deferred split queue, but the destination folio is n= ever >>>>> re-queued. This causes underutilized THPs to escape the shrinker a= fter >>>>> NUMA migration, since they silently drop off the deferred split lis= t. >>>>> >>>>> Fix this by calling deferred_split_folio() on the destination folio= >>>>> after a successful migration, for large rmappable folios. >>>>> >>>>> Reported-by: Johannes Weiner >>>>> Fixes: dafff3f4c850 ("mm: split underused THPs") >>>>> Signed-off-by: Usama Arif >>>>> --- >>>>> mm/migrate.c | 11 +++++++++++ >>>>> 1 file changed, 11 insertions(+) >>>>> >>>>> diff --git a/mm/migrate.c b/mm/migrate.c >>>>> index ece77ccb2ec0..98d0a594f7b7 100644 >>>>> --- a/mm/migrate.c >>>>> +++ b/mm/migrate.c >>>>> @@ -1393,6 +1393,17 @@ static int migrate_folio_move(free_folio_t p= ut_new_folio, unsigned long private, >>>>> if (old_page_state & PAGE_WAS_MAPPED) >>>>> remove_migration_ptes(src, dst, 0); >>>>> >>>>> + /* >>>>> + * Requeue the destination folio on the deferred split queue if >>>>> + * the source was a large folio that was on the queue. Without >>>>> + * this, NUMA migration causes underutilized THPs to escape >>>>> + * the shrinker since the source is unqueued in >>>>> + * __folio_migrate_mapping() and the destination is never >>>>> + * re-queued. >>>>> + */ >>>>> + if (folio_test_large(dst) && folio_test_large_rmappable(dst)) >>>>> + deferred_split_folio(dst, false); >>>> >>>> Doesn't that mean that you will readd any large folios, even if alre= ady >>>> previously taken off the list after scanning? >>>> >>>> So I am not sure if your "if the source was a large folio that was o= n >>>> the queue." comment is accurate? >>>> >>> >>> Yes you are right. How about something like below? We also won't need= to check >>> for anon and non-device folios with this as we only set the the flag = if it was >>> already on deferred_split list. >> >> BTW, migrate_pages() tries to split partially mapped folios before mig= ration[1], >> so what remains in the deferred_list would be: >> >> 1. partially mapped but with a pin, >> 2. fully mapped but potentially underused. >> > > Yes, thats right. > >> I wonder if you want to do an underused scan before migration and try = to split >> underused THPs. > > hmm, I think we should keep THPs as is if there is no memory pressure (= proactive > or otherwise). Scanning THPs for zeros has a cost and we would also los= e the benefit > of THPs when we dont need memory. Makes sense. > >> Or to avoid this additional scan, find a way of detecting >> zero pages at page copy time and split it after migration. >> > > Yeah but I think we lose the benefits of THPs after migration when we d= ont need > additional memory? Right. > >> Anyway, it seems that all large folios are in this deferred_list. Mayb= e, like >> David suggested in his LSFMM proposal, we should scan large folios on = LRU lists >> at reclaim time instead, since there is not much difference between de= ferred_list >> and LRU lists right now. >> > > Yeah the THP shrinker is a very basic implementation and there are a lo= t of > >> >> [1] https://elixir.bootlin.com/linux/v6.19.3/source/mm/migrate.c#L1840= >> > > Also Johannes pointed out its not great storing this information in pag= e flags, > we can just keep it as local variable. This is what the patch would loo= k like: > > > diff --git a/mm/migrate.c b/mm/migrate.c > index ece77ccb2ec0..48a972f158ab 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -1360,6 +1360,7 @@ static int migrate_folio_move(free_folio_t put_ne= w_folio, unsigned long private, > int rc; > int old_page_state =3D 0; > struct anon_vma *anon_vma =3D NULL; > + bool src_deferred_split =3D false; > struct list_head *prev; > > __migrate_folio_extract(dst, &old_page_state, &anon_vma); > @@ -1373,6 +1374,10 @@ static int migrate_folio_move(free_folio_t put_n= ew_folio, unsigned long private, > goto out_unlock_both; > } > > + if (folio_test_large(src) && folio_test_large_rmappable(src) &&= > + !data_race(list_empty(&src->_deferred_list))) > + src_deferred_split =3D true; > + > rc =3D move_to_new_folio(dst, src, mode); > if (rc) > goto out; > @@ -1393,6 +1398,15 @@ static int migrate_folio_move(free_folio_t put_n= ew_folio, unsigned long private, > if (old_page_state & PAGE_WAS_MAPPED) > remove_migration_ptes(src, dst, 0); > > + /* > + * Requeue the destination folio on the deferred split queue if= > + * the source was on the queue. The source is unqueued in > + * __folio_migrate_mapping(), so we recorded the state from > + * before move_to_new_folio(). > + */ > + if (src_deferred_split) > + deferred_split_folio(dst, false); > + > out_unlock_both: > folio_unlock(dst); > folio_set_owner_migrate_reason(dst, reason); LGTM. Thanks for improving it. Best Regards, Yan, Zi