From nobody Sun Feb 8 17:43:02 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 99ED021D599 for ; Sat, 7 Feb 2026 08:16:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770452215; cv=none; b=DdOl19dkFAYldYHkS5WkljVI2/NMq70cqXMXiY1n+cMf0n1K6ASuv5ftVRwFF4vmeO8tlgRHQjcDxF/gm+HivNTxgCRdMXwIZaLIKNo/Z1YWbkRW2TiqC8g0fTuNEXrOsMcWT52yxnx4m+hWdT5L/vXb2ca1KTpJcdh7KqlLeHE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770452215; c=relaxed/simple; bh=vt4tY3XJ3Z6GHRXm44uljElM26c4m3xCmnKDN05g95s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ah6HYZJquRyfvUWRMqta9hpFRz4DB98Y8NnjkjZnVv6iiwusTnq3HX6NObHS2wUK1sFpzEUJIHnwUUPcOc4Q21Ix7XDP/fxvoRTrfdDuhVD/crgGjAQYzlQ1AbdmyE4hGZaXwaQ95n7hi+UmLzRNT29p9Cay8f2fELV0F5zzWQY= 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=nLqjqsYs; arc=none smtp.client-ip=209.85.216.46 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="nLqjqsYs" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-354b79a9ad5so628732a91.1 for ; Sat, 07 Feb 2026 00:16:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770452215; x=1771057015; 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=sRPloOPmIvdTkQu3q4j2KYKMkvQYHLzGzqGMt4kDAVw=; b=nLqjqsYs1zOdZOnlFwCgjghOH5iI1c+SeOOTfEB+dIRpw1+V4D/LW3gWmD3HMiiyth w0XPuy6EiZvMsT6Kd19d2tbiiwNv52gVxKuuvBTv1/H9IMvVIvM3Hw7NpbiYOZFv8zSz x84OmjnzOFvtlMAU8wId0e2C6wlcU+coycKsBW1hdy5nNkvktotf2Dqo6LQ3sTkveo31 TSvyE9kfp/I+UhU3N+kTRT/cTeETFY1FAlpQaYpdRZjzsCcqO3oQGWkETUu+nDNQiQQZ yHz9THwprAl1MSWpWLKVtRurRdCPxC5rSIgAqD3257GIxgYUw8nOAp9l4X4I5XMMniPr sC3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770452215; x=1771057015; 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=sRPloOPmIvdTkQu3q4j2KYKMkvQYHLzGzqGMt4kDAVw=; b=JOFmotrUu9eMSjeQWdQoKgeqbFhs9BqAFc/teJ3liz6GpImbYqvf/C2/b4J8NxG2Qi jv0FXI0qaNpgIPqaW9TdxVxY38dxlCVwrfNqwoyjsDHDs0/fSHyr5z3v2KcnSKJP0o59 EMxwSKJvCvttqCCEm1mFGijzb+NvFb8OpsBa+QHqmhn45RLXP0pSRfhzB832pGW1U/zA b6LTRsY5d+BTq1T4DdknfgaT4e6nxkUpEybeSx8AQHhfmavtv18PWG/J7lJWRwjAc9Up 1qI/2hH30tKwhe6lq4OiLiTca8U3vdQi5f6HHP5poTmdjaY1JsjTk/Gr4wRKsm+KoeF7 F12Q== X-Forwarded-Encrypted: i=1; AJvYcCWs90If6fB7oAbegUg4LXMNfOpoO/YPET2at44mY5/1qvUvWPIAMAb3bK6w9SynLVR6djQY0GJ3ONB7XXE=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9xw9WE2Jjxd/QeqqFghlbm3+J7aCYRSNShl5AiTvbpDGVOM6x aTxy2P5+15qcQyFmpDX9OcN4AMM8P6v7QoeFn5Pnyu/EnfeLzur/4HeF X-Gm-Gg: AZuq6aKWsfjQjGAqPpy2UQFBOh6qOT3xygTPSUJjSXLemgh0Dvz/ojsEel50ONtnicW ECR36ahtHW9KAhkwBNqy+QEzVeuXDJTjigUeK4Pz378iv6gG+5u2Rg4epHCDksVNsB4VoqaDglp 9t+iVO/EbkxjJAo6K7h8k7Ibo2U9yRS/0oBMapfU2aGV0p9bHS2txbOLdboXS5udz6jaRmXjFYF giPshRfE+d15LRpN9iSMgEH2lTF+RSfgwQSbNUAhsFc7w6HpW4PGk/mEakUTRmeh90M51k0Ca9z iPpZSL20EWoE5yAF8M6DXl6+hP5OLQvzuXgx8PedmhF7C+MPdGMRbZUsTPd2VukOWA+9oCN5ngh YnWb8ckHvtWaEiUveV1rAKOVcj/UsVZB6cnUD/4dLMyVy00rrAhMb9D31sAnJJE7lgJk3NfI6jN FA15Yua8z/l9xeG3cmu27VAk0= X-Received: by 2002:a17:90b:1b51:b0:341:2141:df76 with SMTP id 98e67ed59e1d1-354b3c81322mr4971509a91.13.1770452214869; Sat, 07 Feb 2026 00:16:54 -0800 (PST) Received: from localhost.localdomain ([114.231.118.96]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3549c5955a7sm8028189a91.17.2026.02.07.00.16.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Feb 2026 00:16:54 -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 v7 4/5] mm: khugepaged: skip lazy-free folios Date: Sat, 7 Feb 2026 16:16:12 +0800 Message-ID: <20260207081613.588598-5-vernon2gm@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260207081613.588598-1-vernon2gm@gmail.com> References: <20260207081613.588598-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 we collapse with a lazyfree page, that content will never be none and the deferred shrinker cannot reclaim them. 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 Acked-by: David Hildenbrand (arm) Reviewed-by: Lance Yang --- 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 8b68ae3bc2c5..0d160e612e16 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, @@ -583,6 +584,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 && !pte_dirty(pteval) && + folio_test_lazyfree(folio)) { + result =3D SCAN_PAGE_LAZYFREE; + goto out; + } + /* See hpage_collapse_scan_pmd(). */ if (folio_maybe_mapped_shared(folio)) { ++shared; @@ -1335,6 +1342,12 @@ 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_test_lazyfree(folio)) { + 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