[Devel] [PATCH rh7 04/11] ub: do not apply memcg limits on attaching via sys_setluid

Konstantin Khorenko khorenko at virtuozzo.com
Mon May 25 01:44:04 PDT 2015


Kirill, please review.

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team

On 05/20/2015 06:49 PM, Vladimir Davydov wrote:
> I recalled why I had added this patch - we have to activate kmem in the
> underlying memcg before attaching a task to a beancounter.  However, it
> is obviously better to do that when a beancounter is created via the
> legacy API. The patch below does the trick. The only difference between
> the previous patch and this one is that the latter also adds
> ub_update_memcg to get_beancounter_by_name.
> 
> Having said that, Konstantin, please apply the patch below instead of
> the original one.
> 
> Thanks,
> Vladimir
> ---
> From: Vladimir Davydov <vdavydov at parallels.com>
> Subject: [PATCH] ub: apply memcg limits on create not on attach via
>  sys_setluid
> 
> We apply ub limits to the underlying memcg on every attach in order to
> active kmem accounting. Actually, it's saner to do that once on create
> instead of on eacy sys_setluid call. This patch therefore moves
> ub_update_mem_cgroup_limits call from ub_mem_cgroup_attach_task to
> get_beancounter_by_name.
> 
> Also, rename ub_update_mem_cgroup_limits to ub_update_memcg ot match
> ub_sync_memcg.
> 
> Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
> 
> diff --git a/include/bc/beancounter.h b/include/bc/beancounter.h
> index e0ef5ec195fa..a70684390171 100644
> --- a/include/bc/beancounter.h
> +++ b/include/bc/beancounter.h
> @@ -317,8 +317,7 @@ extern void __uncharge_beancounter_locked(struct user_beancounter *ub,
>  extern void uncharge_warn(struct user_beancounter *ub, const char *resource,
>  		unsigned long val, unsigned long held);
>  
> -extern int ub_update_mem_cgroup_limits(struct user_beancounter *ub);
> -
> +extern int ub_update_memcg(struct user_beancounter *ub);
>  extern void ub_sync_memcg(struct user_beancounter *ub);
>  extern void ub_page_stat(struct user_beancounter *ub,
>  			 const nodemask_t *nodemask,
> diff --git a/kernel/bc/beancounter.c b/kernel/bc/beancounter.c
> index d94fb32cd22c..fb0530b4d3a3 100644
> --- a/kernel/bc/beancounter.c
> +++ b/kernel/bc/beancounter.c
> @@ -109,9 +109,6 @@ static void ub_cgroup_close(struct cgroup *root, struct cgroup *cg)
>  		cgroup_kernel_close(cg);
>  }
>  
> -extern int mem_cgroup_apply_beancounter(struct cgroup *cg,
> -					struct user_beancounter *ub);
> -
>  static int ub_mem_cgroup_attach_task(struct user_beancounter *ub,
>  				     struct task_struct *tsk)
>  {
> @@ -121,12 +118,7 @@ static int ub_mem_cgroup_attach_task(struct user_beancounter *ub,
>  	cg = ub_cgroup_open(mem_cgroup_root, ub);
>  	if (IS_ERR(cg))
>  		return PTR_ERR(cg);
> -	if (ub != get_ub0())
> -		ret = mem_cgroup_apply_beancounter(cg, ub);
> -	else
> -		ret = 0;
> -	if (!ret)
> -		ret = cgroup_kernel_attach(cg, tsk);
> +	ret = cgroup_kernel_attach(cg, tsk);
>  	ub_cgroup_close(mem_cgroup_root, cg);
>  	return ret;
>  }
> @@ -186,7 +178,12 @@ fail_blkio:
>  	goto out;
>  }
>  
> -int ub_update_mem_cgroup_limits(struct user_beancounter *ub)
> +extern void mem_cgroup_sync_beancounter(struct cgroup *cg,
> +					struct user_beancounter *ub);
> +extern int mem_cgroup_apply_beancounter(struct cgroup *cg,
> +					struct user_beancounter *ub);
> +
> +int ub_update_memcg(struct user_beancounter *ub)
>  {
>  	struct cgroup *cg;
>  	int ret;
> @@ -202,9 +199,6 @@ int ub_update_mem_cgroup_limits(struct user_beancounter *ub)
>  	return ret;
>  }
>  
> -extern void mem_cgroup_sync_beancounter(struct cgroup *cg,
> -					struct user_beancounter *ub);
> -
>  void ub_sync_memcg(struct user_beancounter *ub)
>  {
>  	struct cgroup *cg;
> @@ -383,6 +377,8 @@ struct user_beancounter *get_beancounter_by_name(const char *name, int create)
>  				return NULL;
>  			pr_warn_once("Allocating UB with syslimits is deprecated!\n");
>  			init_beancounter_syslimits(cgroup_ub(cg));
> +			if (ub_update_memcg(cgroup_ub(cg)) != 0)
> +				pr_warn("Failed to init UB %s limits\n", name);
>  		}
>  	} else {
>  		cg = cgroup_kernel_open(ub_cgroup_root, 0, name);
> diff --git a/kernel/bc/sys.c b/kernel/bc/sys.c
> index 875f05ecad08..096aa978b04e 100644
> --- a/kernel/bc/sys.c
> +++ b/kernel/bc/sys.c
> @@ -99,7 +99,7 @@ long do_setublimit(uid_t uid, unsigned long resource,
>  	init_beancounter_precharge(ub, resource);
>  	spin_unlock_irqrestore(&ub->ub_lock, flags);
>  
> -	error = ub_update_mem_cgroup_limits(ub);
> +	error = ub_update_memcg(ub);
>  
>  	put_beancounter(ub);
>  out:
> 



More information about the Devel mailing list