[Devel] [PATCH rh7] mm/memcg: Release memcg id from css_free callback

Andrey Ryabinin aryabinin at virtuozzo.com
Tue May 14 12:32:52 MSK 2019


Correcting Kostya's email.

On 5/14/19 12:31 PM, Andrey Ryabinin wrote:
> After rebase to kernel-3.10.0-957.10.1.el7 memcg id freed
> in memcg offline callback instead of free. This makes possible
> to reuse id by another cgroup, thus mem_cgroup_uncharge_swap()
> may call css_put() on the wrong cgroup.
> 
> Delay realese of memcg id up to css_free() point.
> 
> https://jira.sw.ru/browse/PSBM-94269
> Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
> ---
>  mm/memcontrol.c | 9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)
> 
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index f2a81d72d3bf..e6e1b8e8c9c9 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -6213,8 +6213,6 @@ unsigned short mem_cgroup_id(struct mem_cgroup *memcg)
>  static void mem_cgroup_id_put(struct mem_cgroup *memcg)
>  {
>  	idr_remove(&mem_cgroup_idr, memcg->id);
> -	memcg->id = 0;
> -	synchronize_rcu();
>  }
>  
>  /**
> @@ -6318,10 +6316,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
>  	for_each_node(node)
>  		free_mem_cgroup_per_zone_info(memcg, node);
>  
> -	if (memcg->id > 0) {
> -		idr_remove(&mem_cgroup_idr, memcg->id);
> -		synchronize_rcu();
> -	}
> +	idr_remove(&mem_cgroup_idr, memcg->id);
>  fail:
>  	kfree(memcg);
>  	return NULL;
> @@ -6344,6 +6339,7 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg)
>  	int i;
>  
>  	mem_cgroup_remove_from_trees(memcg);
> +	mem_cgroup_id_put(memcg);
>  
>  	for_each_node(node)
>  		free_mem_cgroup_per_zone_info(memcg, node);
> @@ -6574,7 +6570,6 @@ static void mem_cgroup_css_offline(struct cgroup *cont)
>  	 */
>  	release_oom_context(&memcg->oom_ctx);
>  
> -	mem_cgroup_id_put(memcg);
>  }
>  
>  static void mem_cgroup_css_free(struct cgroup *cont)
> 


More information about the Devel mailing list