From nobody Sun Feb 8 17:37:24 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 42D321ADC7E for ; Sat, 7 Feb 2026 08:12:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770451969; cv=none; b=SeOYXJLb+4tFGJ/fUFT21HYICxZS2UGwDMp/WQB8ciWdYggqavC4GyrYdIh/JXhr0qV6s9K73OBNJZQ+wTug6NRbUqnC5bqzXrvtO/EidnDJJNSmEaqafDu4wDJqoGry2DR4enBf2lNts5yQr/A15k+MLdUzUThvBwERwmiXuQU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770451969; c=relaxed/simple; bh=vt4tY3XJ3Z6GHRXm44uljElM26c4m3xCmnKDN05g95s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WAzYKfvdtUjVXHWIELP6VQCGEZiFWiDZOi3k5RD9PGHpBhNM2noiKfR7xnbo5Yrjea+Fqk9I8BjFzYREfRJcWurbO9d0Hw9udTLlrAPWh/w+oWkJFgycXoeQsZKeDyjRlRf+G1B8HkplnMFBeea/i30k6/YziTtDHJdJh2J7/38= 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=BGHi/NAu; arc=none smtp.client-ip=209.85.210.182 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="BGHi/NAu" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-81f39438187so2062405b3a.2 for ; Sat, 07 Feb 2026 00:12:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770451968; x=1771056768; 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=BGHi/NAu5uqbsfF9sb8jNkZV82gR2iAsBXOSqA7UvJZWGkMQrMmperWCEICS5ylT9K URYPacVAmjxHkavitRRh3FzlSmYvdjOvWTFsjjYbCn1zhUeFywxICDpnFAah7bfCfttv geifSq/ATvvHzLHtPrvLob/bJk9pS1oNKQPmESNzmyVEAQeKjIlqM2MlRiffi6z8yDdr dstUYX++e6+wZilf1nXg6l83OpmfKzRXk1JTGYtOFeCfws+lV5YhJSjQL4mONvojLeCj 6HBcBsqqTiOWTs6J7kh1aCOF4CmW15+eq5eAU1RT/fBgUDln8dj6G4+t2zd/wBGkPL// +iXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770451968; x=1771056768; 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=ktz2XtqxGr76tMB2EplmsIWHDCRaG1U8QfrQWqaR745CeANmJyP3iAEvoblLHltmaV L4SOIOh5cV+uRgORH4VpBO/QPLQfaZUm4ldbJ/A69gsd46lhE3d8c6keYANSnoRy2zw8 PP/IOLYTkbZeq7s/4e2Q5+1vsI36YWaK5Gew8SAsj/eLS8c3pL/o/0XbLAQOU11li8bZ 0SbRXlnJKGdd/2TGBSWsGR8CYwASAxx0v/uBBEFBiizwLJWdK/vETBAhUkyMbru7n6Qw TmqBCkSewgS7tF085Vxkfgh+2AA3VchTaCpbTCZq8tE9h5fBqGF5J9FEAhZQgioOkVkx FGBQ== X-Forwarded-Encrypted: i=1; AJvYcCX/fb+DedmOr6XgktxUrvX7pn4ZEh+5v6ND4seuIliPXM0YWE9k6KeEC56gv54xHfWf25BOPzQpsEWjtlI=@vger.kernel.org X-Gm-Message-State: AOJu0YyPkA2/EFgk54FnVBs36hIZ7fHoOlO8R8Y+UO5IYwg/qwsS58Vk M5W7atYUBtCZtDEs699n7KjluM4zH4MO9HSKsKmoKm9nUtR2IziN+3MD X-Gm-Gg: AZuq6aLA6vJFxTQXKoh0Aa7jKvHPO25Esm37X+PGRzEgirDKL1EPZ50WY80HbsmcgcZ f3ZpjPiv1oSpGKQ56yc86S+qvYmH5My1tWJ+QHBn0HlFp28f3cXkEYooZSXnN4amKwZgXJgFZiz AyMfzy9sxubG0RWKQcijHQRlxMia/WYGE12v6Si5ZAbt29KsG4+d5nNPgcHJVSHtHBHLsr7Iud0 jxcFKfP0FucniZl3Z260E6WHJ6fnqo1hDbIqC+L8dovkU8aVDIGX7APN9XvbQuLPrnvv4HMAjlA xjD3wowzMCCHD5FK+70Q/vu5mibrhuAviwembg1UA9EgDCTOHfNUFm1kU71UpuyJyPZWC3c33FU uU+OdqCjASkw7/AZ5hrEk5WRQIAVWzQDj+3w+Ynk2jeEP35/uOda0kxKjRIdwpxfLUqae+6VQOX uovf7vq0iZLmlekkqtSH//m7k4UUv85zsHcQ== X-Received: by 2002:a05:6a00:349b:b0:81e:b2ba:5b3a with SMTP id d2e1a72fcca58-8244160a918mr5234998b3a.8.1770451968398; Sat, 07 Feb 2026 00:12:48 -0800 (PST) Received: from localhost.localdomain ([114.231.118.96]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824490442cfsm3951466b3a.16.2026.02.07.00.12.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Feb 2026 00:12:47 -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:11:43 +0800 Message-ID: <20260207081144.588545-5-vernon2gm@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260207081144.588545-1-vernon2gm@gmail.com> References: <20260207081144.588545-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