From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C31DCC5B552 for ; Wed, 4 Jun 2025 09:52:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 49AE26B05BB; Wed, 4 Jun 2025 05:52:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4733E6B05BC; Wed, 4 Jun 2025 05:52:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3886B6B05BF; Wed, 4 Jun 2025 05:52:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 18E916B05BB for ; Wed, 4 Jun 2025 05:52:52 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id C5F571D7017 for ; Wed, 4 Jun 2025 09:52:51 +0000 (UTC) X-FDA: 83517254142.13.DF2781F Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by imf10.hostedemail.com (Postfix) with ESMTP id 4BBEBC000E for ; Wed, 4 Jun 2025 09:52:47 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=samsung.com header.s=mail20170921 header.b=ImtRb+zp; spf=pass (imf10.hostedemail.com: domain of hyesoo.yu@samsung.com designates 203.254.224.33 as permitted sender) smtp.mailfrom=hyesoo.yu@samsung.com; dmarc=pass (policy=none) header.from=samsung.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749030769; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references:references:dkim-signature; bh=U1e46riN5AgpP+BOTQu5flAeRIz4W1sPhNu7S+rH/Xc=; b=tJlMdig3kxsSeGLjDkYncWIXLuXdX6QCJQwZippLHE2XZNz8md4XMKgaV82udUrOPQdNOT oB9MgUSR9R3N97KNFEI2MbaKqqCmCYlk5k5Pgekv7++BXFPS7/121riRIgxARC8OsRI5LJ KBQSb+5BkMZccpHt1GImK3T4RvaAkXM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749030769; a=rsa-sha256; cv=none; b=7+NfM2dH4dbDiCV8DsEe0kOI5zwKyxY/pDg78WOVm9bfTvLGTNxfgHhoFpFnk33w/AHGm+ ZZL676P3L0SgijqW9KMu3Yk7eUcpX5XX3A/eSeoGAw3+HUT04MPPvzlNpavdVt5RIyXn1/ /anSsYaBhaPkRmC+E/VtRtAEWmEzr+Y= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=samsung.com header.s=mail20170921 header.b=ImtRb+zp; spf=pass (imf10.hostedemail.com: domain of hyesoo.yu@samsung.com designates 203.254.224.33 as permitted sender) smtp.mailfrom=hyesoo.yu@samsung.com; dmarc=pass (policy=none) header.from=samsung.com Received: from epcas2p2.samsung.com (unknown [182.195.41.54]) by mailout3.samsung.com (KnoxPortal) with ESMTP id 20250604095244epoutp033173fc573c4dd951def2bb564212ea85~FzjajvEDx2045820458epoutp03d for ; Wed, 4 Jun 2025 09:52:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout3.samsung.com 20250604095244epoutp033173fc573c4dd951def2bb564212ea85~FzjajvEDx2045820458epoutp03d DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1749030764; bh=U1e46riN5AgpP+BOTQu5flAeRIz4W1sPhNu7S+rH/Xc=; h=From:To:Cc:Subject:Date:References:From; b=ImtRb+zpcTMnsRvuuzyfk526/bW3kQ2JGKPv1K68ZjiQfP9ijKsgYMyhYY/xP+Zja p+vfBn2xmL1OcA/NxgRmDLlBcBYHlLmf5bgrj9JHsdM3MSYQdwNEAq4YMu1XcnqPtR MPlodIS0MMYSqMTVXEOIUi5BKmQztnWCV8CHVSEg= Received: from epsnrtp03.localdomain (unknown [182.195.42.155]) by epcas2p2.samsung.com (KnoxPortal) with ESMTPS id 20250604095244epcas2p2f47d4a9682f3931646c1fc0d7b5af49f~FzjaQ3bMI0398503985epcas2p2P; Wed, 4 Jun 2025 09:52:44 +0000 (GMT) Received: from epcas2p1.samsung.com (unknown [182.195.36.97]) by epsnrtp03.localdomain (Postfix) with ESMTP id 4bC2tz2pn2z3hhTC; Wed, 4 Jun 2025 09:52:43 +0000 (GMT) Received: from epsmtip2.samsung.com (unknown [182.195.34.31]) by epcas2p1.samsung.com (KnoxPortal) with ESMTPA id 20250604095242epcas2p17032a1133b03be2d24c8ebcff94d1d55~FzjZMA2Cy0178901789epcas2p1N; Wed, 4 Jun 2025 09:52:42 +0000 (GMT) Received: from localhost.localdomain (unknown [10.229.95.142]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20250604095242epsmtip255f2c31e21b6ff74081e2097b3e4fd75~FzjZGKufv3057430574epsmtip2z; Wed, 4 Jun 2025 09:52:42 +0000 (GMT) From: Hyesoo Yu To: Cc: janghyuck.kim@samsung.com, zhaoyang.huang@unisoc.com, jaewon31.kim@gmail.com, david@redhat.com, Hyesoo Yu , Andrew Morton , Jason Gunthorpe , John Hubbard , Peter Xu , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] mm: gup: fail migration when no migratable page to prevent CMA pinning Date: Wed, 4 Jun 2025 18:50:46 +0900 Message-ID: <20250604095049.4052078-1-hyesoo.yu@samsung.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CMS-MailID: 20250604095242epcas2p17032a1133b03be2d24c8ebcff94d1d55 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: AUTO_CONFIDENTIAL CMS-TYPE: 102P cpgsPolicy: CPGSC10-234,Y X-CFilter-Loop: Reflected X-CMS-RootMailID: 20250604095242epcas2p17032a1133b03be2d24c8ebcff94d1d55 References: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 4BBEBC000E X-Stat-Signature: eg8mte3e3xsegndmnggb1coufdd5dpmd X-Rspam-User: X-HE-Tag: 1749030767-357467 X-HE-Meta: U2FsdGVkX18slnWDyICjlcrSyX7YAJ4iCQAzlgGraa7n33gybX0U+5wSF7Df4qLDwMDcQZIOktA8e9TBKJ/D6X3FPblGuau6163ENbwl7L8qv7bFAFkeEpBHsBG+qL5QrZSHKVJ7SfcX/pyv67Hbmlw3EOEW5rHOZ/c8XaGN6q2w7IySDhpUNc7UXPICRZ+AVQfCuKiEbcOPZXyJ0I7QDM6st997W0f0wgcWqh0FW0Hz5biCOooxEsjozozJ/M2NwDWkuRwpUYtsmaMSmgsbr2M4FhxApSFnI/Ruca34XmhSRK6gjusVfOezoK+xkXHA7NyTDxYIcyjPWshWNv18FqoUGfu6jVsf61leeB31KL4ms+RZYteokR2Gl8NOsVuQa2Hir1JapYazCxVOeflnecsowy8IvWA9sGznUlV/sUcxfFVlPyqs5MXpUJZzQMiblMZJp6mYloJ9SIqu5EgTl1aIk20kIauLom1PNM3BL06VfDbBkyrFG2F8W8suO8zoU8kPbP35VUHBrIz9o7L/Hz9MEmFw468Bqftj12+9bn045Zxungha2vnsdJotZ0lRxg2HfYxa6hG5XqAVOgKUGh7RKNN4Bdoa+8KMijVmi/4xYdawnXrTCB6pFPOpBFTPdz2qnMGp/o6oIwdVAxacl1TFQtrhxazlB5DZ13GZEKxOLiPL3nyvksWWTsvDPKzp6KfDZul0hRU6DUiJ5Z+0KPwvfa7RA0HZoi0TCYgvCDuHJhCQpioAS0c37oxcg0VTAndYRiWOOm68fRwLh64BcHZ0SmXY3ycwUDkGFj67wNZw7A3e3+rD7YArQmrpwp6pGl5Ki0GzUQGe6p610LbTn0HEPHEwLx6kFHHWpMNMXeeNPjh9tX4yo4w21eLp48BRLxOYGDo5jRWaEc53Cc3rPtT8j1mR/rY3VaNs1uFtJ3sCGrJ9cL9DrhqiHdVdJWjXAaRcolfZ+7bYDp/uHA3 OByaPJNq eC/6dSZgFG+OkozGTtc9ONT0fcFbAk0DccPtxWKUU8N6ziP/LVdUHQUfOVP3FTashBpBIykQbAV/7P5uw09hI8Jzzzs9odOwWxrQt9Fb6x9Ur2NwSPeE8091T7EqbSCPPJzH2kthsL4QUM9Y5EWe9ZBbkNBnMTBEKzRbQ X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Commit 1aaf8c122918 ("mm: gup: fix infinite loop within __get_longterm_locked") caused CMA pages to become pinned in some cases when handling longterm GUP. This happened because migration would return success immediately if no pages were in the movable_page_list, without retrying. However, CMA pages can be temporarily off the LRU (e.g., in pagevecs), and therefore not appear in movable_page_list, even though they can be migrated later. Before commit 1aaf8c, the kernel would retry migration in such cases, which helped avoid accidental CMA pinning. The commit 1aaf8c aimed to support an out-of-tree use case (like pKVM), where longterm GUP was applied to non-LRU CMA pages. But allowing CMA pinning in general for this corner case could lead to more fragmentation and reliability issues. So this patch prevents that. Instead of retrying, this patch explicitly fails the migration attempt (-EBUSY) if no movable pages are found and unpinnable pages remain. This avoids infinite loops and gives user a clear signal to retry, rather then spinning inside kernel. Fixes: 1aaf8c122918 ("mm: gup: fix infinite loop within __get_longterm_locked") Signed-off-by: Hyesoo Yu --- mm/gup.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index e065a49842a8..446938aedcc9 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -2303,12 +2303,13 @@ static void pofs_unpin(struct pages_or_folios *pofs) /* * Returns the number of collected folios. Return value is always >= 0. */ -static void collect_longterm_unpinnable_folios( +static bool collect_longterm_unpinnable_folios( struct list_head *movable_folio_list, struct pages_or_folios *pofs) { struct folio *prev_folio = NULL; bool drain_allow = true; + bool any_unpinnable = false; unsigned long i; for (i = 0; i < pofs->nr_entries; i++) { @@ -2321,6 +2322,8 @@ static void collect_longterm_unpinnable_folios( if (folio_is_longterm_pinnable(folio)) continue; + any_unpinnable = true; + if (folio_is_device_coherent(folio)) continue; @@ -2342,6 +2345,8 @@ static void collect_longterm_unpinnable_folios( NR_ISOLATED_ANON + folio_is_file_lru(folio), folio_nr_pages(folio)); } + + return any_unpinnable; } /* @@ -2353,8 +2358,13 @@ static int migrate_longterm_unpinnable_folios(struct list_head *movable_folio_list, struct pages_or_folios *pofs) { - int ret; + int ret = -EAGAIN; unsigned long i; + struct migration_target_control mtc = { + .nid = NUMA_NO_NODE, + .gfp_mask = GFP_USER | __GFP_NOWARN, + .reason = MR_LONGTERM_PIN, + }; for (i = 0; i < pofs->nr_entries; i++) { struct folio *folio = pofs_get_folio(pofs, i); @@ -2370,6 +2380,7 @@ migrate_longterm_unpinnable_folios(struct list_head *movable_folio_list, gup_put_folio(folio, 1, FOLL_PIN); if (migrate_device_coherent_folio(folio)) { + pofs_unpin(pofs); ret = -EBUSY; goto err; } @@ -2388,27 +2399,11 @@ migrate_longterm_unpinnable_folios(struct list_head *movable_folio_list, pofs_clear_entry(pofs, i); } - if (!list_empty(movable_folio_list)) { - struct migration_target_control mtc = { - .nid = NUMA_NO_NODE, - .gfp_mask = GFP_USER | __GFP_NOWARN, - .reason = MR_LONGTERM_PIN, - }; - - if (migrate_pages(movable_folio_list, alloc_migration_target, - NULL, (unsigned long)&mtc, MIGRATE_SYNC, - MR_LONGTERM_PIN, NULL)) { - ret = -ENOMEM; - goto err; - } - } - - putback_movable_pages(movable_folio_list); - - return -EAGAIN; + if (migrate_pages(movable_folio_list, alloc_migration_target, NULL, + (unsigned long)&mtc, MIGRATE_SYNC, MR_LONGTERM_PIN, NULL)) + ret = -ENOMEM; err: - pofs_unpin(pofs); putback_movable_pages(movable_folio_list); return ret; @@ -2417,11 +2412,19 @@ migrate_longterm_unpinnable_folios(struct list_head *movable_folio_list, static long check_and_migrate_movable_pages_or_folios(struct pages_or_folios *pofs) { + bool any_unpinnable; + LIST_HEAD(movable_folio_list); - collect_longterm_unpinnable_folios(&movable_folio_list, pofs); - if (list_empty(&movable_folio_list)) + any_unpinnable = collect_longterm_unpinnable_folios(&movable_folio_list, pofs); + + if (list_empty(&movable_folio_list)) { + if (any_unpinnable) { + pofs_unpin(pofs); + return -EBUSY; + } return 0; + } return migrate_longterm_unpinnable_folios(&movable_folio_list, pofs); } -- 2.49.0