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 <[email protected]> > 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 <[email protected]> > > 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: > _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
