From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta0.migadu.com (out-100.mta0.migadu.com [91.218.175.100]) (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 323342E1EFC for ; Fri, 21 Aug 2026 01:44:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.100 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787276703; cv=none; b=u9I3sMb8Cz8+3tsFOcqldLiSXwLVMRiCLQgOuZxqpxb/GUzKMoKeyhYmxCs4khiNxkUE2GCYTCJpWxf8SWK3Y13e68EbOGuREwb6AaGaJ437Yi/2+5QSL9mTgCs7QfRcjFzaIuYgO5JInHBwAS0JBl4JryjkUezIZZ4QKLUzk8k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787276703; c=relaxed/simple; bh=0k5ukuEriWuoe7c2VoM3YZKYW2oeG0da9ih3CxjEuA0=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=nrgimZlZE8dLBwMIcFs3qjwxTvluZ41gqplPfx26FG3CxOac4naYvH2450IGAHhX4Xo80I4e9vSOpF+Ttmhn7D1v5GUm65nFnUrDJ8gN4Y4OGvtE6U4F3ul4DK5LZ8x6Wg3xy4f0x8wE1rNvb/1vIb0bU4UnfLAciAZ9g5T1TR8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=JkwzS8+O; arc=none smtp.client-ip=91.218.175.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="JkwzS8+O" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=0k5ukuEriWuoe7c2VoM3YZKYW2oeG0da9ih3CxjEuA0=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1787276698; v=1; x=1787881498; b=JkwzS8+OadRSIVTpKR5pim8btuHHovOCs70hGFr9w41Uf5OJtrrTwf33UyOpYBO++Ge6EbC4 n9gRlKF/OSTinH0ydEZnTE4usJaTB5G6bH1W3eZ20nl+gKJyfusuSRYaPa7TIG+6MOBq6WkK7Rd aWJt+BH9KvWHHNPOgR0BnIvs= X-Envelope-To: linux-kernel@vger.kernel.org Received: from [10.63.107.123] (14.29.108.92) by smtp.migadu.com with ESMTPS id 06a7fe33c891c8f4; Fri, 21 Aug 2026 01:44:57 +0000 X-Mizu-Trace-ID: 06a7fe33c891c8f4 X-Migadu-Flow: FLOW_OUT Message-ID: Date: Fri, 21 Aug 2026 09:44:47 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/3] mm/mglru: improve scan_folios() exhaustion detection To: "Barry Song (Xiaomi)" , akpm@linux-foundation.org, linux-mm@kvack.org Cc: axelrasmussen@google.com, baolin.wang@linux.alibaba.com, baoquan.he@linux.dev, chenridong@xiaomi.com, david@kernel.org, hannes@cmpxchg.org, kasong@tencent.com, lianux.mm@gmail.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, wangzicheng@honor.com, weixugc@google.com, yuanchu@google.com References: <20260820045603.68809-1-baohua@kernel.org> <20260820045603.68809-3-baohua@kernel.org> From: Ridong Chen In-Reply-To: <20260820045603.68809-3-baohua@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 8/20/2026 12:56 PM, Barry Song (Xiaomi) wrote: > 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. > > We detect early_stop in scan_folios(). If we stop early for any reason, > it means the current reclaim type is not exhausted yet. If early_stop is > never reached, it means we have exhausted the current oldest generation > without hitting any scanning limit. > > Another issue is that if the lruvec has 4 generations, we might have > exhausted the oldest generation while the second oldest generation is > still reclaimable. In that case, this type is not exhausted yet. > > 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 | 28 ++++++++++++++++++++++------ > 1 file changed, 22 insertions(+), 6 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index d5cc30b667ad..1f2e574b0061 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -4721,7 +4721,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; > @@ -4732,12 +4733,15 @@ 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; > + bool early_stop = false; > > 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; > + } > > gen = lru_gen_from_seq(lrugen->min_seq[type]); > > @@ -4768,8 +4772,10 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, > skipped_zone += delta; > } > > - if (!--remaining || max(isolated, skipped_zone) >= MIN_LRU_BATCH) > + if (!--remaining || max(isolated, skipped_zone) >= MIN_LRU_BATCH) { > + early_stop = true; > break; > + } > } > > if (skipped_zone) { > @@ -4778,8 +4784,10 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, > skipped += skipped_zone; > } > > - if (!remaining || isolated >= MIN_LRU_BATCH) > + if (!remaining || isolated >= MIN_LRU_BATCH) { > + early_stop = true; > break; > + } > } > > item = PGSCAN_KSWAPD + reclaimer_offset(sc); > @@ -4790,6 +4798,13 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec, > scanned, skipped, isolated, > type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON); > > + /* > + * If we didn't stop early, all reclaimable folios in the current > + * generation have been scanned. We are exhausted if this is the last > + * reclaimable generation. > + */ > + *exhausted = !early_stop && > + lrugen->min_seq[type] + MIN_NR_GENS == lrugen->max_seq; > *isolatedp = isolated; > return scanned; > } > @@ -4847,11 +4862,12 @@ static int isolate_folios(unsigned long nr_to_scan, struct lruvec *lruvec, > bool type_fallback_allowed = !is_single_type_reclaim(swappiness); > int type = get_type_to_scan(lruvec, swappiness); > int total_scanned = 0, scanned, tier; > + bool 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) { > @@ -4864,7 +4880,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 (!scanned && type_fallback_allowed) { > + if (exhausted && type_fallback_allowed) { > type = !type; > type_fallback_allowed = false; > goto retry; LGTM. Reviewed-by: Ridong Chen -- Best regards Ridong