From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta1.migadu.com (out-73.mta1.migadu.com [95.215.58.73]) (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 64CF8397925 for ; Fri, 21 Aug 2026 08:18:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787300296; cv=none; b=Xf7Wvgn5YldJFhQsMjawksaXdZ6ZeIjNMAJx5eN8d7sMR5WDlHglVdsjIOYMop8wZPD/6YUUp8xtbFAhgKXARWEYHoB7ENh1RN4qBzE32EjGV6hvZvmW/ryxBwgt9zxREbiFYUyV3xQnwJ4CZbhi0erBRL/RtbfNwOWYSXWolAE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787300296; c=relaxed/simple; bh=oOaNAC0BAF0dHeX/TLdwJ+nW9WDxq122HtWUDNIDsqU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fxyoAfTJ3hYpM0buTOqvnGtzDj0WupQWiKXuLXwXqtCBVE7pBXSgAtpoa2DmJjgQSdz1uLpzerJ0I+toq2j1+/bXDbI/rlpy3xCuJjEc2C1jWIXeDcGvwKqTXDLSRiQani0Ex0BepPYjT7C7YvjffIdyeWsaWmERE9zTJA3vuw4= 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=GG/0Pz/M; arc=none smtp.client-ip=95.215.58.73 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="GG/0Pz/M" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=oOaNAC0BAF0dHeX/TLdwJ+nW9WDxq122HtWUDNIDsqU=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1787300290; v=1; x=1787905090; b=GG/0Pz/MVJq+imhtxEWCZU9fZtdKr8trWjaVkMoLg/Pcx0/u7Mi8cvoO06TZVZtQWZnFibj7 cEgWGIk2yGsBLpulQIgzKJRSn7/hp2xEzvxYS9e5VNrRHiIb6tDg1wBn2xZGYtSRR1epLXXv/cp HiO8KQHFooUpWZav7yqgGvZY= X-Envelope-To: linux-kernel@vger.kernel.org Received: from mi-ThinkCentre-M760t.mioffice.cn (14.29.108.92) by smtp.migadu.com with ESMTPS id 9bdf8f2d2f2975d5; Fri, 21 Aug 2026 08:18:10 +0000 X-Mizu-Trace-ID: 9bdf8f2d2f2975d5 X-Migadu-Flow: FLOW_OUT From: Ridong Chen To: Andrew Morton , Johannes Weiner Cc: David Hildenbrand , Michal Hocko , Qi Zheng , Shakeel Butt , Lorenzo Stoakes , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Ridong Chen , Ridong Chen Subject: [RFC PATCH 1/4] mm/vmscan: only reclaim slab in node reclaim when over min_slab_pages Date: Fri, 21 Aug 2026 16:17:38 +0800 Message-Id: <20260821081741.1340277-2-ridong.chen@linux.dev> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260821081741.1340277-1-ridong.chen@linux.dev> References: <20260821081741.1340277-1-ridong.chen@linux.dev> 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: Ridong Chen Since commit d8ff6fde8e88 ("mm/vmscan: take min_slab_pages into account when try to call shrink_node"), node reclaim enters shrink_node() when reclaimable slab is over min_slab_pages OR unmapped page cache is over min_unmapped_pages. But the threshold only decides whether to enter shrink_node(), not what it reclaims. min_slab_pages is documented to gate slab reclaim alone: "On Zone reclaim slabs will be reclaimed if more than this percentage of pages in a zone are reclaimable slab pages". Yet once unmapped page cache alone trips the gate, shrink_node() still invokes the slab shrinkers and can drive reclaimable slab below min_slab_pages. Carry the decision into the reclaim path via a scan_control flag and skip the slab shrinkers when reclaimable slab is already at or below min_slab_pages, so the limit gates slab reclaim as documented. The flag defaults to zero, so kswapd, direct reclaim, memcg reclaim, proactive reclaim and drop_caches are unaffected; only the node reclaim path sets it. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Ridong Chen --- mm/vmscan.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index c17ac77b08a4..7e65d0ba4a96 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -114,6 +114,12 @@ struct scan_control { /* zone_reclaim_mode, boost reclaim, cgroup restrictions */ unsigned int may_swap:1; + /* + * When set, the slab shrinkers are not invoked because reclaimable + * slab is already at or below min_slab_pages. + */ + unsigned int skip_slab_reclaim:1; + /* Not allow cache_trim_mode to be turned on as part of reclaim? */ unsigned int no_cache_trim_mode:1; @@ -5120,7 +5126,8 @@ static int shrink_one(struct lruvec *lruvec, struct scan_control *sc) need_rotate = try_to_shrink_lruvec(lruvec, sc); - shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, sc->priority); + if (!sc->skip_slab_reclaim) + shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, sc->priority); if (!sc->proactive) vmpressure(sc->gfp_mask, sc->order, memcg, false, @@ -6237,8 +6244,9 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc) shrink_lruvec(lruvec, sc); - shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, - sc->priority); + if (!sc->skip_slab_reclaim) + shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, + sc->priority); /* Record the group's reclaim efficiency */ if (!sc->proactive) @@ -7940,6 +7948,15 @@ unsigned long node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned i if (test_and_set_bit_lock(PGDAT_RECLAIM_LOCKED, &pgdat->flags)) return 0; + /* + * min_slab_pages only gates slab reclaim: when reclaimable slab is + * already at or below the limit, leave the shrinkers alone even if we + * entered node reclaim to trim unmapped page cache. + */ + sc.skip_slab_reclaim = + node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B) <= + pgdat->min_slab_pages; + ret = __node_reclaim(pgdat, nr_pages, &sc); clear_bit_unlock(PGDAT_RECLAIM_LOCKED, &pgdat->flags); -- 2.34.1