Re: [PATCH -next] memcg: move mem_cgroup_swappiness to memcontrol.h

Ridong Chen <[email protected]>
Newsgroups org.kernel.vger.cgroups,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <[email protected]>

On 7/10/2026 7:12 PM, Ridong wrote:
> From: Ridong Chen <[email protected]>
> 
> The per-memcg swappiness knob is v1-only; v2 always uses global
> vm_swappiness and ignores the per-cgroup field.
> 
> Guard memcg->swappiness with CONFIG_MEMCG_V1, and move the helper
> to memcontrol.h where it belongs.
> 
> No functional change for v1; v2-only kernels drop the unused field.
> 
> Signed-off-by: Ridong Chen <[email protected]>
> ---
>  include/linux/memcontrol.h | 25 +++++++++++++++++++++++--
>  include/linux/swap.h       | 19 -------------------
>  mm/memcontrol.c            |  3 +--
>  3 files changed, 24 insertions(+), 23 deletions(-)
> 
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index e1f46a0016fc..f59614956f96 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -239,8 +239,6 @@ struct mem_cgroup {
>  	 */
>  	bool oom_group;
>  
> -	int swappiness;
> -
>  	/* memory.events and memory.events.local */
>  	struct cgroup_file events_file;
>  	struct cgroup_file events_local_file;
> @@ -318,6 +316,9 @@ struct mem_cgroup {
>  	/* List of events which userspace want to receive */
>  	struct list_head event_list;
>  	spinlock_t event_list_lock;
> +
> +	int swappiness;
> +
>  #endif /* CONFIG_MEMCG_V1 */
>  
>  	struct mem_cgroup_per_node *nodeinfo[];
> @@ -365,6 +366,9 @@ enum objext_flags {
>  
>  #define OBJEXTS_FLAGS_MASK (__NR_OBJEXTS_FLAGS - 1)
>  
> +/* Defined in mm/vmscan.c; used by mem_cgroup_swappiness(). */
> +extern int vm_swappiness;
> +
>  #ifdef CONFIG_MEMCG
>  /*
>   * After the initialization objcg->memcg is always pointing at
> @@ -1440,6 +1444,23 @@ static inline void mem_cgroup_flush_workqueue(void) { }
>  static inline int mem_cgroup_init(void) { return 0; }
>  #endif /* CONFIG_MEMCG */
>  
> +static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)
> +{
> +#ifdef CONFIG_MEMCG_V1
> +	/* Cgroup2 doesn't have per-cgroup swappiness */
> +	if (cgroup_subsys_on_dfl(memory_cgrp_subsys))
> +		return READ_ONCE(vm_swappiness);
> +
> +	/* root ? */
> +	if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg))
> +		return READ_ONCE(vm_swappiness);
> +
> +	return READ_ONCE(memcg->swappiness);
> +#else
> +	return READ_ONCE(vm_swappiness);
> +#endif
> +}
> +
>  /*
>   * Extended information for slab objects stored as an array in page->memcg_data
>   * if MEMCG_DATA_OBJEXTS is set.
> diff --git a/include/linux/swap.h b/include/linux/swap.h
> index 3f31b6a56788..f27e73f29195 100644
> --- a/include/linux/swap.h
> +++ b/include/linux/swap.h
> @@ -366,7 +366,6 @@ extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem,
>  						pg_data_t *pgdat,
>  						unsigned long *nr_scanned);
>  extern unsigned long shrink_all_memory(unsigned long nr_pages);
> -extern int vm_swappiness;
>  long remove_mapping(struct address_space *mapping, struct folio *folio);
>  
>  #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA)
> @@ -530,25 +529,7 @@ static inline int add_swap_extent(struct swap_info_struct *sis,
>  }
>  #endif /* CONFIG_SWAP */
>  #ifdef CONFIG_MEMCG
> -static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)
> -{
> -	/* Cgroup2 doesn't have per-cgroup swappiness */
> -	if (cgroup_subsys_on_dfl(memory_cgrp_subsys))
> -		return READ_ONCE(vm_swappiness);
> -
> -	/* root ? */
> -	if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg))
> -		return READ_ONCE(vm_swappiness);
> -
> -	return READ_ONCE(memcg->swappiness);
> -}
> -
>  void lru_reparent_memcg(struct mem_cgroup *memcg, struct mem_cgroup *parent, int nid);
> -#else
> -static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
> -{
> -	return READ_ONCE(vm_swappiness);
> -}
>  #endif
>  
>  #if defined(CONFIG_SWAP) && defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 938f190a98fe..2d659b76cd77 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -4174,11 +4174,10 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
>  #endif
>  	page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX);
>  	if (parent) {
> -		WRITE_ONCE(memcg->swappiness, mem_cgroup_swappiness(parent));
> -
>  		page_counter_init(&memcg->memory, &parent->memory, memcg_on_dfl);
>  		page_counter_init(&memcg->swap, &parent->swap, false);
>  #ifdef CONFIG_MEMCG_V1
> +		WRITE_ONCE(memcg->swappiness, mem_cgroup_swappiness(parent));
>  		memcg->memory.track_failcnt = !memcg_on_dfl;
>  		WRITE_ONCE(memcg->oom_kill_disable, READ_ONCE(parent->oom_kill_disable));
>  		page_counter_init(&memcg->kmem, &parent->kmem, false);

I have resent this patch [1], as I found another issue related to it.

[1]
https://lore.kernel.org/linux-mm/[email protected]/

-- 
Best regards,
Ridong
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.