From nobody Thu Apr 2 15:41:46 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 44DF0342521 for ; Sat, 21 Feb 2026 09:40:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771666809; cv=none; b=Hfj+yQJ5k8pDE1uN+xhwxByT0Zgrn540pIX8gSt2mn3KYkh1SBHD4GNWVtbmSZT3Aa+uOH0lQQvGzhWclFmiptgGmWxffzsIvEOYbEeDd4IZbe2rIr0oGzQp8wpTHybDmqh6zZzwOLGas0eGVvDnflVKMDbvXNOz7dYixClFjeo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771666809; c=relaxed/simple; bh=g2pZ9aWWz5k5+nKkY2aZc9wtDJl6I/IrJ4T6R9qWr8g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LYh6DB4zzHFH0gSz1WBcrl6AgbG3peYsM5n+HdKZUQy0ly4chL7nBHtaqkFMLGwQL/9Ne2KthvXa8JEhe38tQ9+P5gfPTDuf8fd9BbR3+/zypmJjpIAL6BwZXKBN9CY1X4iQ77lTSxhDbFpfNmPWJMddUJHOIZEChP/1oSPJ3h4= 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=LHjPrW6b; arc=none smtp.client-ip=209.85.210.170 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="LHjPrW6b" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-8217f2ad01eso2887692b3a.2 for ; Sat, 21 Feb 2026 01:40:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771666807; x=1772271607; 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=edzhGk8tZ/b1bwNazhyh0vnVmdmocc6fgdNviuUpG8U=; b=LHjPrW6bcHt2LG0mBUU23Z+sG2h7KB9cfl2cpoo9t8+u+19uY9T+UF8ERnmCX5beOD kzORVtvyzRiHBa7MoN8IMfsCryxYtCKFhBYYDFkNROPcHkbuz+DR7FxhW7/3cJ+PQ09/ CJZFdFJmFmdkH814uUxkK24T3AMXpRtYWNOGBg5ZeTGSp9q2VHfOQx/yIoHXf9pM94jR 2lL9IaAaIWg2LrAqnHV48m0XPd8vp33D+krBNQrM4GVzyUnVdZR7Fu6H9NXpdWZCva65 0E2JuJl9aVKmUyvk1umiY2gSmI3hsp5RjBMqMBfaH7FjyJjO5rVSwqrvj5OTU+k2rOSl abPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771666807; x=1772271607; 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=edzhGk8tZ/b1bwNazhyh0vnVmdmocc6fgdNviuUpG8U=; b=re1tsVAK5P3iy34Ae+74A9BxtIqjKjN+hkNBichME7FxPjLo8GivnmcA+a06AmtVLq tdrZZQp6TmIRUIpCIiKPBtm5TBsE2O7U+AvHTrRNYAIpdbTA2AET0tDRIBxopCtPXbTu B3yyRtguuJEnivgLAXH+yRbL80Ht/iHaWXVtkNY/sak+07uuQthEGV1MgyjSkMzWO+Wi N5Ur76lJLS6EjcD2FfPFz0vRHUyUCg9YyZftiOaKGC7FsH8fWq8Fxv5roOBJf0yj9s/3 Z2Fp9X2H3IxE+TYs4fsHV5a6CcqwNmoaUQp+6VOlQvCGeZQxvO6ZXxtLGBvx9sUH6Equ cpAQ== X-Forwarded-Encrypted: i=1; AJvYcCXSXyM38p5LssfNAV2pJXdllp9CdLa1UMJt2FIDKaOoO0YDurO9l5LPDI5B51Ec6VzyitnMzLWnRHic7vo=@vger.kernel.org X-Gm-Message-State: AOJu0YzhqUv+KyG5N5rh4D+bQIRZMrtsdWAbRt09d6+wl1wRZ5KrANxC 8ynxVJMnnYHzVGdIyEqV11fngBbnOEaXeuWUCbaO3zDMWmeCvbtBHRR5 X-Gm-Gg: AZuq6aJhZBXBsCMnMpHc1VZfUadKrZRVEUcBtdmm/o5sgeDnTb65wVmuBhoVb+lElfA iwOShvzunL/AGwEktGZDC3rJ7ZCE2ZAXge2JBfyMaKtMiccdwe4Wi/TxGMLHbLM/G9222g0qtUf okW+p2PuvtcNPM4+2INvu1QL2ebYuugRcLNXhzIx0MjCdZo6ewx6sJKUNC7JdEZPHuAgQJIQP1D Pqdh296VkDXbAi8zj4S+6WGneszPQmzmkIHXpAA8x9lCx7H2l0FSLe6BwZ8EBNAKet/tWX2nqvU L0+91Lo6obPW1IT4XmH1qJsiivWe+u2mJdDAsGIrQqkI7SbYQ9gw7hsYdQ15SsIZA8I8QYFzDak gbd/kpnnpzaQ6aFynpopKhOcdM4b3g3sD7Z6BRhUnDeswLIZnlT/rFQGWvsakRXzYqb8vdFdapu 4zjaI6Lipyc5K/sDF+TesVi/R0KkZvwcHaw/mYtHvcoSHO X-Received: by 2002:a05:6a00:450a:b0:81f:3d13:e07e with SMTP id d2e1a72fcca58-826da9ee90dmr2286218b3a.41.1771666807525; Sat, 21 Feb 2026 01:40:07 -0800 (PST) Received: from localhost.localdomain ([49.79.21.101]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-826dd8ba11bsm1761708b3a.50.2026.02.21.01.40.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Feb 2026 01:40:07 -0800 (PST) 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 v8 4/4] mm: khugepaged: skip lazy-free folios Date: Sat, 21 Feb 2026 17:39:18 +0800 Message-ID: <20260221093918.1456187-5-vernon2gm@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260221093918.1456187-1-vernon2gm@gmail.com> References: <20260221093918.1456187-1-vernon2gm@gmail.com> 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" From: Vernon Yang 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 and then 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. And if all folios in VM_DROPPABLE are lazyfree, Collapsing maintains that property, so we can just collapse and memory pressure in the future will free it up. In contrast, collapsing in !VM_DROPPABLE does not maintain that property, the collapsed folio will not be lazyfree and memory pressure in the future will not be able to free it up. So if the user has explicitly informed us via MADV_FREE that this memory will be freed, and this vma does not have VM_DROPPABLE flags, 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 Acked-by: David Hildenbrand (arm) Reviewed-by: Lance Yang Reviewed-by: Barry Song --- include/trace/events/huge_memory.h | 1 + mm/khugepaged.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/trace/events/huge_memory.h b/include/trace/events/huge= _memory.h index 384e29f6bef0..bcdc57eea270 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 61e25cf5424b..e792e9074b48 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, @@ -574,6 +575,12 @@ static enum scan_result __collapse_huge_page_isolate(s= truct vm_area_struct *vma, folio =3D page_folio(page); VM_BUG_ON_FOLIO(!folio_test_anon(folio), folio); =20 + if (cc->is_khugepaged && !(vma->vm_flags & VM_DROPPABLE) && + folio_test_lazyfree(folio) && !pte_dirty(pteval)) { + result =3D SCAN_PAGE_LAZYFREE; + goto out; + } + /* See hpage_collapse_scan_pmd(). */ if (folio_maybe_mapped_shared(folio)) { ++shared; @@ -1326,6 +1333,12 @@ static enum scan_result hpage_collapse_scan_pmd(stru= ct mm_struct *mm, } folio =3D page_folio(page); =20 + if (cc->is_khugepaged && !(vma->vm_flags & VM_DROPPABLE) && + folio_test_lazyfree(folio) && !pte_dirty(pteval)) { + 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