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 C292F3D953A for ; Fri, 31 Jul 2026 08:39:16 +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=1785487157; cv=none; b=HLFlplZ7uPoLf43BHSeWUJpViYw2HoKH1nNZMZk6yMZje9S+IM7GOMUuoo4nTlyRV9PQUJciBRk3xsN+Pug0TI/lRDAm8pohfwnGtjTdbA8ZAMdJi+NlUGK2DoHSw1uyE9XOsqtJHJGZ93NqeDhe1qWzlxw7sf0MwREicI6fuQ0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785487157; c=relaxed/simple; bh=cPE/fBdUE/ox4jo0Z4xuOssFz/5s5fgX8oI+mSYk5Fw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UeBl8AGJaIQ8Y0eBoptRm4OUbV9W1n6eB1JCM9Oeo7QUCGBEyf0iRfQeW/N1+9t12iv7MrzkGN1RDtfB4TR8PuqDmCv/rMD4xUxh54zpOtTmoCD1bZJKGciGsNqz+8hCsxl+JQZULTxv6dgl7kmTAxC+2IFuIdQAxdulFtIUkDk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oB5R0jJl; 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="oB5R0jJl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 491851F00ACA; Fri, 31 Jul 2026 08:39:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785487156; bh=AvSIyHGbFQ1xRyWKcwWNl/S/3zQ4GNtnzqsqU1kijnI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=oB5R0jJl9rpHQNnSXw+f7IDGKtQYOmfWfdnJgVy38zEsNN8R5zf0M71p8oteLlYZD oMGUm2b87+pPjeAkFYkPI/iRVCG39Kp/tGMwtnxEfBDR0wQ5xyP1tCfuKD6PuASCRc LklG8eCQrx/rPxMfVcHtcUTG2k3fM5uGIKuHE6dWrt0dMMySoVK/SdhpvgTV7xM03M EUJMERFNO4b7wctVfbVTZJEopBnlQIckPKI+yzMdYTczrhplEKDmbnQgVE1D3w+SiR 0lL2r4ntXf4c9xn4ORaVdh67DAhwOSpV5/02RmB1ANDVSPqdlQpiJpxsqhHCyfLiH4 6qEF87Nx8PhgA== 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 4/6] mm: mglru: improve scan_folios() exhaustion detection Date: Fri, 31 Jul 2026 16:38:41 +0800 Message-Id: <20260731083843.37811-5-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 Commit 16b475d2ac3c ("mm/mglru: avoid reclaim type fall back when isolation makes no progress") uses scanned == 0 to determine whether scan_folios() has exhausted a reclaim type. However, this is not always sufficient. It is possible for scanned > 0, while the oldest reclaimable generation is exhausted after the first scan_folios() call. Add an exhausted output argument to scan_folios() so it can explicitly report whether the reclaimable lists for the current type have been exhausted. Signed-off-by: Barry Song (Xiaomi) --- mm/vmscan.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 0038f33aa318..2e7fef6975b6 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4707,7 +4707,8 @@ static bool isolate_folio(struct lruvec *lruvec, struct folio *folio, struct sca static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, struct scan_control *sc, int type, int tier, - struct list_head *list, int *isolatedp) + struct list_head *list, int *isolatedp, + bool *exhausted) { int i; int gen; @@ -4723,8 +4724,10 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, VM_WARN_ON_ONCE(nr_to_scan > MAX_LRU_BATCH); VM_WARN_ON_ONCE(!list_empty(list)); - if (get_nr_gens(lruvec, type) == MIN_NR_GENS) + if (get_nr_gens(lruvec, type) == MIN_NR_GENS) { + *exhausted = true; return 0; + } next_gen: gen = lru_gen_from_seq(min_seq); @@ -4785,6 +4788,11 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, scanned, skipped, isolated, type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON); + /* + * This scan exhausted the reclaimable lists before reaching the + * scan target or accumulating enough isolated folios. + */ + *exhausted = remaining > 0 && isolated < MIN_LRU_BATCH; *isolatedp = isolated; return scanned; } @@ -4842,12 +4850,12 @@ static int isolate_folios(unsigned long nr_to_scan, struct lruvec *lruvec, bool single_type = is_single_type_reclaim(swappiness); int type = get_type_to_scan(lruvec, swappiness); int total_scanned = 0, scanned, tier; - bool tried = false; + bool tried = false, exhausted; retry: tier = get_tier_idx(lruvec, type); scanned = scan_folios(nr_to_scan, lruvec, sc, - type, tier, list, isolated); + type, tier, list, isolated, &exhausted); total_scanned += scanned; if (*isolated) { @@ -4860,7 +4868,7 @@ static int isolate_folios(unsigned long nr_to_scan, struct lruvec *lruvec, * We are running out of the current reclaim type. Fall back to * the other type if allowed. */ - if (!tried && !scanned && !single_type) { + if (!tried && exhausted && !single_type) { type = !type; tried = true; goto retry; -- 2.34.1