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 791743D953A for ; Fri, 31 Jul 2026 08:39:09 +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=1785487150; cv=none; b=mB19hGdkkuEbXpSdhW5lBKoXvtFGCh0RHFvxOSlGAjlTnmmrGA+Sj7Hjy0MWMITyTOS64Y9W03LsSgt9eofGpcSekoVxQvZI59DLtF1Dlx4veQhfCMrFQARgCkbxCGKRjgz1a2MuMtSfDEWSZk4qZMeqElU5PmQr/KzoaAzljbo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785487150; c=relaxed/simple; bh=wTTSHv8Qeo6B1VR3hq5t1c9kMRMIFdcbHs+/cJaaJW4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Zu0I7V4YPQgt5oWio+0hCSCrtAYkhxkjkU4KkCq6KgNJZFjtxiDX8KEE17RjD8H7hlc4ISstz3+trdadrq0jWh8fTpAeE0cnewnn/uRSRfF3RNdqKT923cKZCOLqWlUBqzKtnbcZg2P7YV967wU3eecMQvuNG71FBG4gq7IFxv8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Vesdli7t; 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="Vesdli7t" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A763C1F000E9; Fri, 31 Jul 2026 08:39:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785487149; bh=eGS47ujxTvtlq11ZCiBl4aLoPuUh0trV8PXbmmGJxG0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Vesdli7txUOZi8YTM10BgeOKsRiQZoXphJj+BNdln3V6vmaSIL625HyEuf7jV+/X9 FQWWXB2la+2QgphgyByXKbHDJLR9Fp9z5oB4Jdu2/xNmFGtFXsP4VKALXo5AEsV/U+ Ww7jaHzQg9vj7Oz4VOFtwm9/kzfETkxnuqZsKaHSlknJsD/K+u2ULirYN2DW3ew1bs YRgcbdMpugr3k/TH05t/1fZcL3ekneYjW/DoqV225cjyRatdqafO5hKl4jNNq8lwow TSb6PQzHJf6qC2Vj533l7IRPkffo02gyh2DsRIKp+lLEcqPMMSWJs76Le1LXkLXbn/ YY1dgcyZxN1dw== From: "Barry Song (Xiaomi)" To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: axelrasmussen@google.com, david@kernel.org, hannes@cmpxchg.org, kasong@tencent.com, linux-kernel@vger.kernel.org, ljs@kernel.org, lyugaofei@xiaomi.com, mhocko@kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev, stevensd@chromium.org, weixugc@google.com, yuanchu@google.com, chenridong@xiaomi.com, zhangbo56@xiaomi.com, wangzicheng@honor.com, lianux.mm@gmail.com, "Barry Song (Xiaomi)" Subject: [RFC PATCH v3 2/6] mm: mglru: let scan_folios() scan both reclaimable generations Date: Fri, 31 Jul 2026 16:38:39 +0800 Message-Id: <20260731083843.37811-3-baohua@kernel.org> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260731083843.37811-1-baohua@kernel.org> References: <20260731083843.37811-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 When we have four generations, and scan_folios() exhausts the oldest one while the second-oldest still contains reclaimable folios, the current implementation doesn't move on to scan the second-oldest generation. Instead, it returns, leaving that generation with no chance to be scanned at the current sc->priority. This doesn't seem right. Rather than breaking out and starting a larger next iteration, let's let scan_folios() continue scanning the second-oldest generation directly. Signed-off-by: Barry Song (Xiaomi) --- mm/vmscan.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index ce027c271e9b..31947fa60f18 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4718,6 +4718,7 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, int skipped = 0; unsigned long remaining = nr_to_scan; struct lru_gen_folio *lrugen = &lruvec->lrugen; + unsigned long min_seq = lrugen->min_seq[type]; VM_WARN_ON_ONCE(nr_to_scan > MAX_LRU_BATCH); VM_WARN_ON_ONCE(!list_empty(list)); @@ -4725,8 +4726,8 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, if (get_nr_gens(lruvec, type) == MIN_NR_GENS) return 0; - gen = lru_gen_from_seq(lrugen->min_seq[type]); - +next_gen: + gen = lru_gen_from_seq(min_seq); for (i = MAX_NR_ZONES; i > 0; i--) { LIST_HEAD(moved); int skipped_zone = 0; @@ -4768,6 +4769,14 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, break; } + /* + * This generation is exhausted across all zones, but the scan + * target has not been reached yet. Continue with the next + * reclaimable generation. + */ + if (i == 0 && ++min_seq + MIN_NR_GENS <= lrugen->max_seq) + goto next_gen; + item = PGSCAN_KSWAPD + reclaimer_offset(sc); mod_lruvec_state(lruvec, item, isolated); mod_lruvec_state(lruvec, PGREFILL, sorted); -- 2.34.1