From nobody Tue Feb 10 15:45:49 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66F67322B6C for ; Sun, 11 Jan 2026 12:20:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768134007; cv=none; b=EcoNU3BGcYH2+w67Tn/KOHW0gjaW2OVRjCSMB2h9BVYJk3WfRscwdQdtN8S+igPGv7hJtaXYg3WDgU6Bhwy9qhuqF7ekeKYNZ9g4l2AaWxFfeJQjo2kCt2MV8qrC2mXrN2uvcBFiw5F/T00+x+rHXNClj4nyrfnQxRSGU6zbYNw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768134007; c=relaxed/simple; bh=Dd6a77pU7u2o1FsMS5TQAH3aWnT4zay+bnWq2AxeVXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tja+rdi6okxC9aLb3txmN5j9EjyXlpNUtmr95khOGKqEs02PWlHvZlofSFS5S36L3x4VrFPiY7q9kPgDtqidtDUGtvsjgqvhEK3ZOtW9XCjzRJnJNKjP9TxwV0MVvimMt6s34FyUEiH9QaKS585KWAqFZJT9ZyQHBJq6Q0X1wyw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=No9fC9fl; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="No9fC9fl" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-34be2be4b7cso2821599a91.3 for ; Sun, 11 Jan 2026 04:20:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768134006; x=1768738806; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0G/uIiDDNOHZeA/w76cf8T95IZ/86Sc506HuzqiPhO4=; b=No9fC9flmcz05WsYR2XnlEwCEbxlWCxxvi/L/i3G11yxNvOl9jQ/wlec3ZTewqK4jq PscurEa+5hVuj+iwyvs/YV1JRih/Qmb0x1b2mFGKraMyG3PG4J8s1mAkaD2siAEc8sdz GiG6+6SlUK9OZykIvBJE2zBSnHSZNdwMmWm74x3eUJIEZa33mFe+RzfYcm8RaXF6LVGu pXIVizjMVjjBBdyn7rhkZG1bF1eDI6sp1xZOpTtj3kloCqdf1HJtsHqR6B+PiFdTHqRX YYxcfzl4EuFiY1Va5UvTgUl7e74hGTf5fxLX08C3C35rEOIZXU5AuWbqMF9cxmavXZRu NUDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768134006; x=1768738806; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0G/uIiDDNOHZeA/w76cf8T95IZ/86Sc506HuzqiPhO4=; b=FGNxb+maYReVxqjuCjydRFmA8b5rJ/88PyPaZzkcRAzsafEr/IVsdwrk+F2YZsIM2i ss2vG4yCDZBAoYYABEI81mPPMMjJwiULAZqYdJ9XgJI1cDrvyUqX+5/zteIjXrgY3JBz z+kRf7SWen1sFCOPePL5n2rAyXWkRkl6BzYT6rl6/nwNa4sOBjKpvdCVtw8wHMGx7xEM uIjfIDwautbeyc1cYncDQIYpF4FzWLneQoc5LYinhXSGxSFjur1Y7IDX14xGpqL5VTsd DI8tuQPA6riva1+u/wFf3au7HwNQaQG0JMv6qfsybtOl8xABmwIDfSodCOoWZSDZEeYt 58Ew== X-Forwarded-Encrypted: i=1; AJvYcCX/zxAMj1eNsgw2mYzbBli0kOSGK7EC9ywrRlLx0kOAsvhcB1TH9CmMCh91shaLxFFag7Jw2EspxsIYCVI=@vger.kernel.org X-Gm-Message-State: AOJu0YwaLCVSjh2iCwIZOld1SDqSj8Vek5g0LwsticA1P0TlCc0AV0Hn 9LdZCicNJ9yAY6bHL4J4Dr8C9g4N1dA3YqMM30EK/dUkgeZwK4po3Hmc X-Gm-Gg: AY/fxX4PFF1mxLtwsGlN+/5MJEHf22ik8droqSV0POHQsFOuPcYJmKkx/+Tc7OSXPhF qLytnvqlH/XVrT9p7y4+CzGUWteGSPC5JrY1aVwNzF2CR8x99aMW3Da0giNOhnMvjX6I1MKs+v/ k3QRD6SQ+kNVCU87fjmCyPMPT32I1LsNz6Gtb3ReZGxS0qI738lMPVdOUJTklssuEBiL/6cl8UM ykRtB7N4Y6TYxvqJp8WkVPBsUrEr1D2ldfLAlHIk9mJnxmfREr5R1BGEm17lJtcd0jBjs2lfcdD 8HSkxwPPC2DUR0Hwo5dy6cxNUGwnsjgYlHerez+vzRhUrW7/xPOBAB4eoN5JJBBKU7CyIBtnA7+ u69yfXNnc8EyZS+JdtH41avbD+nCeWMJidqqNjCg/8SUd3MHBsBODavJgE7oipZ3IkxzjX2/PF2 8upmNijEhcRFOfCfACSPMg9YGDeWJPEw== X-Google-Smtp-Source: AGHT+IFS7T+REkqaxeUsDPamccnMWWVG2Bbbk1hI/lGfgiUMKIziKTqaxzze5hdv2cumkVYboUFq3g== X-Received: by 2002:a17:90b:4b88:b0:340:6f07:fefa with SMTP id 98e67ed59e1d1-34f68c03251mr14942182a91.20.1768134005658; Sun, 11 Jan 2026 04:20:05 -0800 (PST) Received: from localhost.localdomain ([221.227.246.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34f6b07029fsm4877954a91.2.2026.01.11.04.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Jan 2026 04:20:04 -0800 (PST) From: Vernon Yang X-Google-Original-From: Vernon Yang To: akpm@linux-foundation.org, david@kernel.org Cc: lorenzo.stoakes@oracle.com, ziy@nvidia.com, dev.jain@arm.com, baohua@kernel.org, lance.yang@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Vernon Yang Subject: [PATCH mm-new v4 5/6] mm: khugepaged: skip lazy-free folios at scanning Date: Sun, 11 Jan 2026 20:19:08 +0800 Message-ID: <20260111121909.8410-6-yanglincheng@kylinos.cn> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260111121909.8410-1-yanglincheng@kylinos.cn> References: <20260111121909.8410-1-yanglincheng@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For example, create three task: hot1 -> cold -> hot2. After all three task are created, each allocate memory 128MB. the hot1/hot2 task continuously access 128 MB memory, while the cold task only accesses its memory briefly andthen call madvise(MADV_FREE). However, khugepaged still prioritizes scanning the cold task and only scans the hot2 task after completing the scan of the cold task. So if the user has explicitly informed us via MADV_FREE that this memory will be freed, it is appropriate for khugepaged to skip it only, thereby avoiding unnecessary scan and collapse operations to reducing CPU wastage. Here are the performance test results: (Throughput bigger is better, other smaller is better) Testing on x86_64 machine: | task hot2 | without patch | with patch | delta | |---------------------|---------------|---------------|---------| | total accesses time | 3.14 sec | 2.93 sec | -6.69% | | cycles per access | 4.96 | 2.21 | -55.44% | | Throughput | 104.38 M/sec | 111.89 M/sec | +7.19% | | dTLB-load-misses | 284814532 | 69597236 | -75.56% | Testing on qemu-system-x86_64 -enable-kvm: | task hot2 | without patch | with patch | delta | |---------------------|---------------|---------------|---------| | total accesses time | 3.35 sec | 2.96 sec | -11.64% | | cycles per access | 7.29 | 2.07 | -71.60% | | Throughput | 97.67 M/sec | 110.77 M/sec | +13.41% | | dTLB-load-misses | 241600871 | 3216108 | -98.67% | Signed-off-by: Vernon Yang --- include/trace/events/huge_memory.h | 1 + mm/khugepaged.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/trace/events/huge_memory.h b/include/trace/events/huge= _memory.h index 3d1069c3f0c5..e3856f8ab9eb 100644 --- a/include/trace/events/huge_memory.h +++ b/include/trace/events/huge_memory.h @@ -25,6 +25,7 @@ EM( SCAN_PAGE_LRU, "page_not_in_lru") \ EM( SCAN_PAGE_LOCK, "page_locked") \ EM( SCAN_PAGE_ANON, "page_not_anon") \ + EM( SCAN_PAGE_LAZYFREE, "page_lazyfree") \ EM( SCAN_PAGE_COMPOUND, "page_compound") \ EM( SCAN_ANY_PROCESS, "no_process_for_page") \ EM( SCAN_VMA_NULL, "vma_null") \ diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 6df2857d94c6..8a7008760566 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -46,6 +46,7 @@ enum scan_result { SCAN_PAGE_LRU, SCAN_PAGE_LOCK, SCAN_PAGE_ANON, + SCAN_PAGE_LAZYFREE, SCAN_PAGE_COMPOUND, SCAN_ANY_PROCESS, SCAN_VMA_NULL, @@ -1258,6 +1259,7 @@ static enum scan_result hpage_collapse_scan_pmd(struc= t mm_struct *mm, pmd_t *pmd; pte_t *pte, *_pte; int none_or_zero =3D 0, shared =3D 0, referenced =3D 0; + int lazyfree =3D 0; enum scan_result result =3D SCAN_FAIL; struct page *page =3D NULL; struct folio *folio =3D NULL; @@ -1343,6 +1345,21 @@ static enum scan_result hpage_collapse_scan_pmd(stru= ct mm_struct *mm, } folio =3D page_folio(page); =20 + if (cc->is_khugepaged && !pte_dirty(pteval) && + folio_is_lazyfree(folio)) { + ++lazyfree; + + /* + * The lazyfree folios are reclaimed and become pte_none. + * Ensure they do not continue to be collapsed when + * skipped ahead. + */ + if ((lazyfree + none_or_zero) > khugepaged_max_ptes_none) { + result =3D SCAN_PAGE_LAZYFREE; + goto out_unmap; + } + } + if (!folio_test_anon(folio)) { result =3D SCAN_PAGE_ANON; goto out_unmap; --=20 2.51.0