From nobody Mon Apr 13 07:12:26 2026 Received: from outbound.st.icloud.com (p-east2-cluster5-host12-snip4-6.eps.apple.com [57.103.79.79]) (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 073CA214204 for ; Fri, 10 Apr 2026 12:44:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.79.79 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775825080; cv=none; b=mnsqzJhssodam2+i4ATa03NO92Dkf2Cxw0yKzIRt5K9WCfTdm/xIPn+lKXKj+Osf07IEnIjw/WBCorknq6Q1OQYG70cLCYmKMxCrKvu0H4Gm0cp3NQRLRzZzomwvkOwb3p0JqeubvacbJpo6YKWL2TGyb1nM35BoCHRQpFC3gOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775825080; c=relaxed/simple; bh=zWB/b0UX77NUsZLNabvQJnXU6XcpAog6MaO8o4rjLHI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kGRxzTHz8WWLc+jHyvinE8ZWd18Ii5lawyn7bfkCN4B+j0eFhzY1EfCOwNZ6M6BBcHCKGH+Qa5R+ODuLWMTxpqCe18xUvNhHlEYDKK5mgknikQ7CKPQbKQbvwTUge6CPyqozkSqX14zZm1grJwVRM9+pCt1aUlWHUFIXhDp+XT0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=lAQGjq/g; arc=none smtp.client-ip=57.103.79.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="lAQGjq/g" Received: from outbound.st.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-1a-100-percent-0 (Postfix) with ESMTPS id 42F5418001A7; Fri, 10 Apr 2026 12:44:35 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775825078; x=1778417078; bh=yWdo7Hdt7imdUj5xnZfV2DW+WMLcx/gdexYpPpAmv2g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:x-icloud-hme; b=lAQGjq/g7UcTBPINXozb+x/3UkwpLgoir36EfHLkOZFF53LMl6GX+SD8KE5ANiyuk6yokiqNt6IP9eSVaRjuExjPuFXOnt+EvaZAAoesfmWxZ3KsxSGUFJQctRHjiW2+oeaDtUesAcfERGFMl5i+flQXawiME5rcHyEv0e94NXo7wDJZaMs/+jJbMmviQGhI7BUj7l9TEZIGfEwU7Rc8boIPFCWSLKvjhmVWNqwY8gdEPxxoMun/gh6Tiv/1Sl1KXMPPo7aE3OrFizcJlBxrxCBSLUkNRseAUDuzFfcDRY1p3pf/eFFgUFinL3VAexPfCXSp5F+DRLFK70IO/riz2w== Received: from [21.6.122.162] (unknown [17.42.251.67]) by p00-icloudmta-asmtp-us-east-1a-100-percent-0 (Postfix) with ESMTPSA id 9938118002C9; Fri, 10 Apr 2026 12:44:29 +0000 (UTC) From: Zhang Peng Date: Fri, 10 Apr 2026 20:44:02 +0800 Subject: [PATCH v3 4/5] mm/vmscan: extract folio unmap logic into folio_try_unmap() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260410-batch-tlb-flush-v3-4-ff0b9d3a351a@icloud.com> References: <20260410-batch-tlb-flush-v3-0-ff0b9d3a351a@icloud.com> In-Reply-To: <20260410-batch-tlb-flush-v3-0-ff0b9d3a351a@icloud.com> To: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Johannes Weiner , Qi Zheng , Shakeel Butt , Axel Rasmussen , Yuanchu Xie , Wei Xu , Michal Hocko Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Kairui Song , Zhang Peng X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775825044; l=3583; i=zippermonkey@icloud.com; s=20260309; h=from:subject:message-id; bh=Y4Ryu6QrIkBwzzotoKqlopBsSJ0saBN29iSqKN2EdmU=; b=874860+xk4cJPDuTM+XHgE1UfY0vAlWSFQ3ZmtH1qL9yYregIaV76AyXpDLsziUFjGhheoS7F Zy8uaGXlcHMD4FgOU7bm2KY/SMLYbXX+UGM1mLfxQgHcycZhLjINmmL X-Developer-Key: i=zippermonkey@icloud.com; a=ed25519; pk=tPCLpFnBfIyHsp0k7eaUTUREEa36bQNW/69X+NS8wBU= X-Proofpoint-ORIG-GUID: GLk-jVPy0vNigIB7TtleosjzPtlVoQ81 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDEwMDExNyBTYWx0ZWRfX9qO4tI6tj5qs nx99lE9JTIIKEJKnhJrB9tw8ePCLgV5asT1acUP2SPzD5AQxl9QlTRcL9BzUk7eJzRc+NpY7xHM /oiULPiY23Ctngm5QjYkFksqqxpFXIQkSAKG6wS+I6yh/OZx3ekGSsMuEmvbC34edd7VkZ3381a GoymUqi1JSUSyn6l/W5M2DyicOdcSn6FdgwOvJhgjmGTPk7umdg3HHm1sWA88yHxvfcXkjPkFDF 1uxh8Vh0lzQZjLkHgIDc9cQ1jSh/WKTKlQiDftWEDLWJgqQHr+svgNgHFo5lRh0+YVSUCFZ2vAm WQAq1qgvhbqS7MAcHkZMEKrczabq1ndCMG7++f5MovWyQVJ9evORZjeUtHSmlk= X-Authority-Info-Out: v=2.4 cv=V+ZwEOni c=1 sm=1 tr=0 ts=69d8f0b4 cx=c_apl:c_pps:t_out a=YrL12D//S6tul8v/L+6tKg==:117 a=YrL12D//S6tul8v/L+6tKg==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=YE32fvk_ji8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=GvQkQWPkAAAA:8 a=Eai1HigTdSjqxVI1HoIA:9 a=QEXdDO2ut3YA:10 a=J82S1U87d15UFHHUFZS8:22 a=R6HnoDE5lksTgPyyjrIf:22 X-Proofpoint-GUID: GLk-jVPy0vNigIB7TtleosjzPtlVoQ81 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-10_03,2026-04-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=995 spamscore=0 mlxscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 bulkscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604100117 From: Zhang Peng shrink_folio_list() contains a self-contained block that sets up TTU flags and calls try_to_unmap(), accounting for failures via reclaim_stat. Extract it into folio_try_unmap() to reduce the size of shrink_folio_list() and make the unmap step independently readable. No functional change. Suggested-by: Kairui Song Signed-off-by: Zhang Peng --- mm/vmscan.c | 70 +++++++++++++++++++++++++++++++++++----------------------= ---- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index c8ff742ed891..63cc88c875e8 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1217,6 +1217,44 @@ static void pageout_one(struct folio *folio, struct = list_head *ret_folios, folio_test_unevictable(folio), folio); } =20 +static bool folio_try_unmap(struct folio *folio, struct reclaim_stat *stat, + unsigned int nr_pages) +{ + enum ttu_flags flags =3D TTU_BATCH_FLUSH; + bool was_swapbacked; + + if (!folio_mapped(folio)) + return true; + + was_swapbacked =3D folio_test_swapbacked(folio); + if (folio_test_pmd_mappable(folio)) + flags |=3D TTU_SPLIT_HUGE_PMD; + /* + * Without TTU_SYNC, try_to_unmap will only begin to + * hold PTL from the first present PTE within a large + * folio. Some initial PTEs might be skipped due to + * races with parallel PTE writes in which PTEs can be + * cleared temporarily before being written new present + * values. This will lead to a large folio is still + * mapped while some subpages have been partially + * unmapped after try_to_unmap; TTU_SYNC helps + * try_to_unmap acquire PTL from the first PTE, + * eliminating the influence of temporary PTE values. + */ + if (folio_test_large(folio)) + flags |=3D TTU_SYNC; + + try_to_unmap(folio, flags); + if (folio_mapped(folio)) { + stat->nr_unmap_fail +=3D nr_pages; + if (!was_swapbacked && + folio_test_swapbacked(folio)) + stat->nr_lazyfree_fail +=3D nr_pages; + return false; + } + return true; +} + /* * Reclaimed folios are counted in stat->nr_reclaimed. */ @@ -1491,36 +1529,8 @@ static void shrink_folio_list(struct list_head *foli= o_list, * The folio is mapped into the page tables of one or more * processes. Try to unmap it here. */ - if (folio_mapped(folio)) { - enum ttu_flags flags =3D TTU_BATCH_FLUSH; - bool was_swapbacked =3D folio_test_swapbacked(folio); - - if (folio_test_pmd_mappable(folio)) - flags |=3D TTU_SPLIT_HUGE_PMD; - /* - * Without TTU_SYNC, try_to_unmap will only begin to - * hold PTL from the first present PTE within a large - * folio. Some initial PTEs might be skipped due to - * races with parallel PTE writes in which PTEs can be - * cleared temporarily before being written new present - * values. This will lead to a large folio is still - * mapped while some subpages have been partially - * unmapped after try_to_unmap; TTU_SYNC helps - * try_to_unmap acquire PTL from the first PTE, - * eliminating the influence of temporary PTE values. - */ - if (folio_test_large(folio)) - flags |=3D TTU_SYNC; - - try_to_unmap(folio, flags); - if (folio_mapped(folio)) { - stat->nr_unmap_fail +=3D nr_pages; - if (!was_swapbacked && - folio_test_swapbacked(folio)) - stat->nr_lazyfree_fail +=3D nr_pages; - goto activate_locked; - } - } + if (!folio_try_unmap(folio, stat, nr_pages)) + goto activate_locked; =20 /* * Folio is unmapped now so it cannot be newly pinned anymore. --=20 2.43.7