From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012032.outbound.protection.outlook.com [40.93.195.32]) (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 A2D0B35BDD5 for ; Tue, 21 Apr 2026 05:57:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.32 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776751059; cv=fail; b=p5rwp4NyTEthlqUbMyOW2I2kX7jPf0s0uakq74nVwuxXuLRiehnQYAbzCq5LfLLHXWluFyyKiHS//zWj3l0/OGXNIq/wsrJcraSX2n4Bg7uv8YXk21ngMJKYo2gTHLDq15ATlO1DYO97kxHjVEmlgOfPvZ7gNzAuNuaejzOASZA= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776751059; c=relaxed/simple; bh=YK1b0tRm1pGpboQlk8947m6FcysqOKwni4CPKnHoWmc=; h=Date:From:To:Cc:Subject:Message-ID:References:Content-Type: Content-Disposition:In-Reply-To:MIME-Version; b=ahTk5wyQ0FTtFVqEFlt2qoho8lpM9jvaVAaxqOaKgg7equv5duAMxbl6L4Y14ZdDtsYW4sJ2QEQr3WWkfsb0YLM+IIljHwKR/yEauLB1clgfEgsJ4WYDVEp9v0PLNCY7aQUF/KyJi6lDr6dEqViZn0LyJgGUn58e3XLRE0E+u3s= 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=kb28dF05; arc=fail smtp.client-ip=40.93.195.32 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="kb28dF05" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=J+oXQ32bzo05utcA+YYwh94VxBn7mO/GNpRDCsPmBMCC2JCvWvbtZfZy97Qdx3fu9vRLhSVsL/OlG4m27MFX6rYoHtxY/f8Q5TDG5IQQVRWxegP7wigTmt5KXpZekzgoUOKu7LWWyb2Dv7kN4QW0tBU/6KNVK6wlAv6O3naOQmcYy8cVi6XswJh8cxPP1fPk3PKLuDdWfUpEEibGSpO0tOWPxf+GefNobQ5RJ2A1g4q1dS3vPkUd37js9B+NyAJXXXzJqIO2AXNh32kto0Cri1hjf98lU7fKTdm0+H3CYrQW7zesVFrXpsTmMhbWS6Ro6QkQ6S4+hVHk8dOTIuvyLw== 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=jrDnHwfIjI04ZjftgTLRQIzeTVE9MuhfGXqkkjUMJik=; b=ytON228veybh97pnLtvck17GT9RcGHlhaKJuWOXTjtg0a0TU9Xc+0qM7/fxMX+7ufv5BI1KAOASH9HtBkv443xoe+7ofCRtiX2Ioc7+nt7AmCw6l5+Ko896bYtH0VGvH7Fe/yHPCE1QOhAvt5qvIKgEzpPuOc1UAP/XC2eesuGki4Ugu8ynA4z7vUU6QPoqphKIZQWcuSXSwJKGR6a6zQ68wuSF53zqadDSCQPe6uOox4+16CLt9WFq5VH1KsKTGdbhJL52k1/3qPC4Z9Dvf76drEW4jnGjE+N/RCZydMEfQiz7gIR6eCaz4BBbvNp4AqyJyaVQnWI1mAXkeTiNIvA== 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=jrDnHwfIjI04ZjftgTLRQIzeTVE9MuhfGXqkkjUMJik=; b=kb28dF05bZMqFi01raM3T3Fqvev4SeZ78p7woEltXllWCDqXOTHu5sLP7JSNxSKt22es798rtN6BrVbmoY+lIEIvvjt8+1iArpehdWcDeYYe4VVFQQGgccE1Ix2gswVIqnPsH28WbuDzTFD3j0kkMgzBKkBk2C9CovW5jW0z51O0QKBDtlH4ZClTCmAlcFQP/PgV/IKt4MutOCCh+myf4D3QSSchVk8E8QJ4FtbxxUgRXxdZYHPCaI5ncCBf88AUmRryWU2Ty8OFBV2pxWzxpj4T+vjO/cBT8bUsuUNVyX/eiBN/jHnFzHRRQo7wKmEmc643+2mH3sXLeoOyME69Qw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by CH2PR12MB4213.namprd12.prod.outlook.com (2603:10b6:610:a4::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.16; Tue, 21 Apr 2026 05:57:22 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::5807:8e24:69b0:f6c0]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::5807:8e24:69b0:f6c0%4]) with mapi id 15.20.9846.016; Tue, 21 Apr 2026 05:57:22 +0000 Date: Tue, 21 Apr 2026 15:57:17 +1000 From: Alistair Popple To: John Hubbard Cc: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Zi Yan , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Axel Rasmussen , Yuanchu Xie , Wei Xu , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , LKML , linux-mm@kvack.org Subject: Re: [RFC PATCH 2/2] mm/migrate: wait for folio refcount during longterm pin migration Message-ID: References: <20260410032333.400406-1-jhubbard@nvidia.com> <20260410032333.400406-3-jhubbard@nvidia.com> Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260410032333.400406-3-jhubbard@nvidia.com> X-ClientProxiedBy: SY5P300CA0093.AUSP300.PROD.OUTLOOK.COM (2603:10c6:10:248::25) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) 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: DS0PR12MB7726:EE_|CH2PR12MB4213:EE_ X-MS-Office365-Filtering-Correlation-Id: 2dd86fa7-0032-44f8-b66b-08de9f6adadd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: fS4DdwM7I/j0mIsCVTB1FsVUlTbPCI0xx1OSLyLVfZCRh0iGRvJESzfN+U1wDnFQXSbimbE5ijNZechwZ8LJHvJ0z21MZ3arqJ/NbZUmXPzuo88Vlv86oyXOrCFxHL7bqOEiJyIYsZCraaOyhtt1xMKgN/wcEwKDfdPx/TU5b2xskB0YZPL+t3rNHMLV35VwCZ0zEbqBmtIBmCmNcsdkWaRyok4VtQO05ScqsYFOyhfJqngQy3l3U7xTQhEZIPF7ytdjf3cSiw0ZNuHharAST5YhGf4y5tkz7UDRJLcb1i66XJPsYCbzPDoEZWuabLPU5dFSqPVWFP1DC8pse8GZKCYwvU8t/++dK5Zr58zifwxZMdOf8Zi+SsFDELgtFpKP1Qvd0Rj5uPStZEFIUgEj77tS9UzoFsXCuJ9jUBo5vEOUL0Kbst7tpQrX8xQEPBK9ANW8JuZ5XYcDHzgpZHuwV+lABSDEhMrmKDRsEVqfKC+KpNGOC+uEcG/VzHWvas0GeBn3r+Oj4qzpzGOvduD3KhUrgnEwnQGQZLDYqbOm+/4f2XIFBjM+zuP8fcdRPIXvxTlRut4XWiHQfNBGj50dccf26kf2poDHh+dAqJdjUF0jmSE2EjnkW1fDVLsquEWAgzxEZ/xxoeP5hduhe4Pzam/PcvYJAQOPqXBIPca6PgVKVrb68Jn29BEGPE9hGnE1q6c7SgPDX27DFdLnSSJ0oIpgbqk6+KH073eL/lKZoG4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1xr4KbioQkURTvnW3rs0CejxIgok2NrtBmpRhrYMvFXFBnMsO05JH4rJOd1O?= =?us-ascii?Q?qITWEMtzI+yNYMi7nGd6vPkJ6KRG1qQQWKeHalsDkZgqijIUdUpAqGGdDNv7?= =?us-ascii?Q?XhnGROwK3t2joS8c4RzSSjQ/x66PhHSaAzye9BQIxJoNIffaAEGp8c29NP8k?= =?us-ascii?Q?VAydJZS+uWl8Ohfz92viYql9A1Rm61RiMaJjAApz3B7D6k1eaDLRUc+jCz2O?= =?us-ascii?Q?a79/L0DHe8svkRBzB5eCk4IuT5NjZu5rTKVQl2q4y7wdqVIuNrEflVYvIYRm?= =?us-ascii?Q?+dUbaU9VNVRhHMIAAI+dt5qBxR3ksY2ViANv1EM2HmTS0HdMadBLqEOOYTIm?= =?us-ascii?Q?U5HEaZLSoiWrla7bR73Cjbp8oQ0idk79LhRNAtW4M6tRZTp+p8ATDQJaWixk?= =?us-ascii?Q?xbiGuE0QX+XBkw8JrnabfVsQyAP6jzydqwA5teK0NGhrPKZNoimwvM4FOvRy?= =?us-ascii?Q?8AvCxEOM4ZZla9/wda47XdGb6Z8rR/GV3K8dGGNLSpIN2gt/XE/ptLKDqmFx?= =?us-ascii?Q?R2lWkIb919VdPBNn3OTzwnDzEh9HaYsEDvkcBwRc6Ni0Yt2s3xkCP8kXnApY?= =?us-ascii?Q?uedxr0KCZjdy5bnRcDjj26B751G1shd1T0KshpxDzD+F+4RBkHbBLHu0fy7x?= =?us-ascii?Q?/9KLoEkUxvHqWpYiqogRE3AwMWY+L7FLVFb0HJn0tJO3lUjk6xxlnvk96TSg?= =?us-ascii?Q?4+rRLuOZXwyiac6sHY1F9mfUJwXeDL1epCgwKfJWXO65oCi2E3BVplYygsTx?= =?us-ascii?Q?TurQCMHYLlBp+GLH86FacDdsfaLcOpSVQmCuiiky+fDovYQbmKUFqwzk0gG/?= =?us-ascii?Q?jnmconO8ld1THkPLu0+ewj+a2wShz5o5FXxF4Vpmw0FO0aj7amU/QBEe6ZXp?= =?us-ascii?Q?drxVLh4eyn1+CFMzC2uvBmkSyMljH0Yzg9qU2XVB71bkrjqAEfvR8QAZjgJw?= =?us-ascii?Q?FlGqTaLzp8x/4WdiZDFcCHcSvG95p2E4ZF/DiWKx2nSbznvVPXC3ZIn1q5e0?= =?us-ascii?Q?6KGdmQbcrU6xmPrpBHfbF2FSIEx0ZAR6Tdx2EPZ3ERb4O5cvGOI0O89e5z7S?= =?us-ascii?Q?kLYzZLAQRDt1iHNH223/2eKbg12dnijiDyaoHbQmonLji2+l1E7tr+dkkSd0?= =?us-ascii?Q?liYjTwtGd1/gfVJUs2oCmRzh2+LmDM5Pm8JLEPCxSlti76meKfzNsqHP5oAo?= =?us-ascii?Q?5GPQ5sJgBfglBJUQDZbvTHcCgG4PR1foEtsk9Fy1ClGAyptF3sA9hNvhjvNO?= =?us-ascii?Q?U9rCknlus5pf8rQbrRLm1u5WP5q3u+LM5x2PpxIOqBB+mPsWywgTgbXNfFs8?= =?us-ascii?Q?WyqwTqw6bxh1EVwyiJ2XLuxWwLG2Rfu1zslt7176hQqlHkKP2/WpQhszgWMn?= =?us-ascii?Q?UvQ8JZGQO8rungUXJj9k9NszmwQuAiDOrAtPF+cqTeV/h+qdsr6jpf+O3RsR?= =?us-ascii?Q?XEePj/hzyz1+vOA54IQvJNgm67fWBl7YUnoN/MlRIwZ2rjJx0NeQvwwqJ+Ew?= =?us-ascii?Q?XAkwYlYVc1lsT39x5hXVPoP+rLXwWRUT/2L56T+iiaCDzCKpIu2LcOc3t2n0?= =?us-ascii?Q?3oMkKntV2Yaj3J2cSJj1p8VF1k8TSCj17lIQELZf/+d3+nlYkfwP1LaSMgNL?= =?us-ascii?Q?nt7l+jdw+YhzgI8ldX+92aZhmCj7WOWNg8kz4JQ5UWxulynzsApxw5oTKa40?= =?us-ascii?Q?S05s4ZMJYSjSPAeg6NK6L2U7tX/xPM2vp7iBIA412T8S8Ae8YxU8xpxtZ3t5?= =?us-ascii?Q?5MHkPFBTgg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2dd86fa7-0032-44f8-b66b-08de9f6adadd X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Apr 2026 05:57:22.2702 (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: TLxfFa2yYftvPE84zuDYmHUDx+GS+WJ9XZhBl1PyD0y5n8eylVaMt5khzXAkqbDWA+dUJlqlAlP9TCcbSSdZ8w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB4213 On 2026-04-10 at 13:23 +1000, John Hubbard wrote... > When migrating pages for FOLL_LONGTERM pinning (MR_LONGTERM_PIN), the > migration can fail with -EAGAIN if the folio has unexpected references. > These references are often transient (e.g., from GPU operations like > cuMemset that will complete shortly). Is there a reason this logic should only apply to FOLL_LONGTERM pinning? Or could it also apply more generally to any ZONE_MOVABLE page, for which migration should eventually succeed? Currently that has similar retry logic of NR_MAX_MIGRATE_PAGES_RETRY times and give up. We have a similar retry problems in mm/migrate_device.c:migrate_vma_*() so I could see something similar being potentially useful there. - Alistair > Previously, the migration code would retry up to 10 times > (NR_MAX_MIGRATE_PAGES_RETRY), but this busy-retry approach failed when > the transient reference holder needed more time than the retry loop > provides. > > Fix this by waiting up to one second for the folio's refcount to drop > to the expected value before retrying migration. The wait uses > wait_var_event_timeout() paired with the wake_up_var() calls added to > folio_put() in the previous commit. If the timeout expires, the > existing retry loop continues as before. The folio_put_wakeup_key > static key is enabled for the duration of migrate_pages() so that > folio_put() only wakes waiters when migration is active. > > Signed-off-by: John Hubbard > --- > mm/migrate.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/mm/migrate.c b/mm/migrate.c > index 2c3d489ecf51..a5d9f85aa376 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -47,6 +47,8 @@ > #include > > #include > +#include > +#include > > #include "internal.h" > #include "swap.h" > @@ -1732,6 +1734,17 @@ static void migrate_folios_move(struct list_head *src_folios, > *retry += 1; > *thp_retry += is_thp; > *nr_retry_pages += nr_pages; > + /* > + * For longterm pinning, wait for references > + * to be released before retrying. > + */ > + if (reason == MR_LONGTERM_PIN) { > + int expected = folio_expected_ref_count(folio) + 1; > + > + wait_var_event_timeout(&folio->_refcount, > + folio_ref_count(folio) <= expected, > + HZ); > + } > break; > case 0: > stats->nr_succeeded += nr_pages; > @@ -1941,6 +1954,17 @@ static int migrate_pages_batch(struct list_head *from, > retry++; > thp_retry += is_thp; > nr_retry_pages += nr_pages; > + /* > + * For longterm pinning, wait for references > + * to be released. > + */ > + if (reason == MR_LONGTERM_PIN) { > + int expected = folio_expected_ref_count(folio) + 1; > + > + wait_var_event_timeout(&folio->_refcount, > + folio_ref_count(folio) <= expected, > + HZ); > + } > break; > case 0: > list_move_tail(&folio->lru, &unmap_folios); > @@ -2085,6 +2109,9 @@ int migrate_pages(struct list_head *from, new_folio_t get_new_folio, > > memset(&stats, 0, sizeof(stats)); > > + if (reason == MR_LONGTERM_PIN) > + static_branch_inc(&folio_put_wakeup_key); > + > rc_gather = migrate_hugetlbs(from, get_new_folio, put_new_folio, private, > mode, reason, &stats, &ret_folios); > if (rc_gather < 0) > @@ -2137,6 +2164,9 @@ int migrate_pages(struct list_head *from, new_folio_t get_new_folio, > if (!list_empty(from)) > goto again; > out: > + if (reason == MR_LONGTERM_PIN) > + static_branch_dec(&folio_put_wakeup_key); > + > /* > * Put the permanent failure folio back to migration list, they > * will be put back to the right list by the caller. > -- > 2.53.0 >