From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 B5372385D9B for ; Sun, 26 Jul 2026 12:21:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785068505; cv=none; b=sDuclnAVLtTwtgVZrAaELaG0FvSR/txk9K1AM4Kuv5/KmptTpbbzDb0+sclZOP1STIhHNqTbejzyR+Py/95pUNNV2j9lLONmANVSiveT1RbrVYJs8qxqGfK3CU3R12i/MTIapsy7GyEfrS5Q0bBGXTLNsBmkWK3GN425elOtwM4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785068505; c=relaxed/simple; bh=ex+XLNTSejgm6w5RN021vtNqry4xxYMW1Gjs0ua6+AI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rPntBcrQe3njB7XCGYVuBrRfhnNbVQCYw28KjhCYI46vZHhhsHR8sc2RPPYbAdGWUuuCZBTQDc8fcjBVh3Bk5Hg45tTkbS91VXvqfw1vkueDRLyZblOFZ2hTJs3B12oQoIDAWOhLHeMi1KGm+rtKgAPyvzjr7viw0H4NeVpHiL8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HWpoUqyC; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HWpoUqyC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 97EDF1F00A3A; Sun, 26 Jul 2026 12:21:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785068504; bh=rIggAH7nXXHD1h8IG5wZBwSQaz/UD4riocclvIOPnZA=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=HWpoUqyCz0QtgeAdidYH8EFE1xZlvqJVHdtveFhcFBur0Bi9dygKvH0bgpDk1HY6G 7uea+FeAP6UU9DOVb72sNAuzHj8UHLtyBGwqh5UmR67NiVM4JdQa4PfrirUIKQov7x j6hXSn5WKHYva/GGAPLyceOK0+BzrVLLUzUwMW7MDInp8Ox6ZpHGOsQ7+zCjTlM+F0 IvV10HObUfelf82OlVzWVNA86jIAUHUbJlownxcpojBuWzyV0c1jOid2PV1yPliXFQ naSnE9a4frToBhKvVVRKxkrBs4+kuGLbySWNypDg2GDTL/cO+aSffvJZ4a2i/CIgVr cXXiyCd9h1yUw== From: "Barry Song (Xiaomi)" To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: hannes@cmpxchg.org, david@kernel.org, mhocko@kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev, ljs@kernel.org, kasong@tencent.com, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, linux-kernel@vger.kernel.org, lyugaofei@xiaomi.com, stevensd@chromium.org, Barry Song Subject: [RFC PATCH v2 4/5] mm: mglru: run aging when pages are severely imbalanced across gens Date: Sun, 26 Jul 2026 20:21:22 +0800 Message-Id: <20260726122123.7614-5-baohua@kernel.org> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260726122123.7614-1-baohua@kernel.org> References: <20260726122123.7614-1-baohua@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: lyugaofei This partially restores the reclaim behavior introduced in Yu Zhao's initial MGLRU commit, ac35a4902370 ("mm: multi-gen LRU: minimal implementation"): /* * It's also ideal to spread pages out evenly, i.e., 1/(MIN_NR_GENS+1) * of the total number of pages for each generation. A reasonable range * for this average portion is [1/MIN_NR_GENS, 1/(MIN_NR_GENS+2)]. The * aging cares about the upper bound of hot pages, while the eviction * cares about the lower bound of cold pages. */ if (young * MIN_NR_GENS > total) return true; if (old * (MIN_NR_GENS + 2) < total) return true; But with a stricter condition: the younger generations must contain at least four times as many folios as the older generations. This allows aging to keep folios of the preferred type spread across the reclaimable generations. Signed-off-by: lyugaofei Co-developed-by: Barry Song (Xiaomi) Signed-off-by: Barry Song (Xiaomi) --- mm/vmscan.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index d6bd64b4dced..7c13dedb0b1f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4956,9 +4956,40 @@ static int evict_folios(unsigned long nr_to_scan, struct lruvec *lruvec, return scanned; } +static bool lru_gen_imbalanced(struct lruvec *lruvec, int type, + unsigned long max_seq, unsigned long min_seq, + int swappiness) +{ + struct lru_gen_folio *lrugen = &lruvec->lrugen; + unsigned long young = 0, old = 0, seq; + + /* + * reclaim is forced to a single type in those cases, so there is + * no need to consider the swappiness bias + */ + if (swappiness == MIN_SWAPPINESS || swappiness > MAX_SWAPPINESS) + return false; + + for (seq = min_seq; seq <= max_seq; seq++) { + int gen = lru_gen_from_seq(seq); + unsigned long size = 0; + int zone; + + for (zone = 0; zone < MAX_NR_ZONES; zone++) + size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L); + + if (seq + MIN_NR_GENS > max_seq) + young += size; + else + old += size; + } + return young > old * 4; +} + static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, struct scan_control *sc, int swappiness) { + int type = get_type_to_scan(lruvec, swappiness); DEFINE_MIN_SEQ(lruvec); /* have to run aging, since eviction is not possible anymore */ @@ -4970,7 +5001,11 @@ static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, return false; /* better to run aging even though eviction is still possible */ - return evictable_min_seq(min_seq, swappiness) + MIN_NR_GENS == max_seq; + if (evictable_min_seq(min_seq, swappiness) + MIN_NR_GENS == max_seq) + return true; + + /* Run aging if the preferred type is severely imbalanced across gens */ + return lru_gen_imbalanced(lruvec, type, max_seq, min_seq[type], swappiness); } static long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, -- 2.39.3 (Apple Git-146)