Re: [PATCH v5 17/36] mm/vmscan: disallow reclaim of private node memory

[email protected] Tue, 21 Jul 2026 18:35:27 +0000
Newsgroups dev.linux.lists.nvdimm,dev.linux.lists.damon,org.kernel.vger.kvm,org.kernel.vger.linux-cxl
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Soft-limit reclaim bypasses the new private node filter, allowing eviction on private nodes.
--

--- Patch [17]: [PATCH v5 17/36] mm/vmscan: disallow reclaim of private node memory ---
commit 9fc4bff86adde3091fee2924952f9af9700e6308
Author: Gregory Price <[email protected]>

mm/vmscan: disallow reclaim of private node memory

This commit attempts to prevent reclaim on private nodes by adding a filter
to shrink_node().

> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index e26c6931f5fde..86b2334c23b98 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -6141,6 +6141,13 @@ static void shrink_node(pg_data_t *pgdat, struct scan_control *sc)
>  	struct lruvec *target_lruvec;
>  	bool reclaimable = false;
>  
> +	/*
> +	 * Private nodes do not support reclaim by default, filtering here
> +	 * captures all normal reclaim paths that may attempt eviction.
> +	 */
> +	if (node_is_private(pgdat->node_id))
> +		return;
> +

[Severity: High]
Does this filter successfully capture all normal reclaim paths?

When the system uses memcg v1 and a cgroup exceeds its soft limit, global
direct reclaim in shrink_zones() or kswapd in balance_pgdat() will invoke
memcg1_soft_limit_reclaim(). This bypasses shrink_node() entirely:

mm/vmscan.c:shrink_zones() {
    ...
    nr_soft_reclaimed = memcg1_soft_limit_reclaim(zone->zone_pgdat,
                                                  sc->order, sc->gfp_mask,
                                                  &nr_soft_scanned);
    ...
}

This leads to mem_cgroup_shrink_node() directly calling shrink_lruvec()
without checking if the node is private:

mm/vmscan.c:mem_cgroup_shrink_node() {
    ...
    shrink_lruvec(lruvec, &sc);
    ...
}

Will this allow unintended eviction on private nodes during soft limit reclaim?

>  	if ((lru_gen_enabled() || lru_gen_switching()) && root_reclaim(sc)) {
>  		memset(&sc->nr, 0, sizeof(sc->nr));
>  		lru_gen_shrink_node(pgdat, sc);

-- 
Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=17