On 25.06.2020 17:29, Valeriy Vdovin wrote: > As long as each ve is internally attached to a particular > css_set via it's init_task, it's good to have container with parameters, > which are common to each cgroup subsystem hierarchy, rooting from it's > virtual root. > > Signed-off-by: Valeriy Vdovin <[email protected]>
Reviewed-by: Kirill Tkhai <[email protected]> One new line is needed in below. > --- > include/linux/ve.h | 7 ++++++ > kernel/ve/ve.c | 72 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 79 insertions(+) > > diff --git a/include/linux/ve.h b/include/linux/ve.h > index 4dbd216..65413d5 100644 > --- a/include/linux/ve.h > +++ b/include/linux/ve.h > @@ -137,6 +137,13 @@ struct ve_struct { > struct work_struct release_agent_work; > > /* > + * List of data, private for each root cgroup in > + * ve's css_set. > + */ > + struct list_head per_cgroot_list; > + struct raw_spinlock per_cgroot_list_lock; > + > + /* > * All tasks, that belong to this ve, live > * in cgroups, that are children to cgroups > * that form this css_set. > diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c > index 9e6bb8b..4660419 100644 > --- a/kernel/ve/ve.c > +++ b/kernel/ve/ve.c > @@ -45,6 +45,14 @@ > #include <linux/vziptable_defs.h> > #include <net/rtnetlink.h> > > +struct per_cgroot_data { > + struct list_head list; > + /* > + * data is related to this cgroup > + */ > + struct cgroup *cgroot; > +}; > + > extern struct kmapset_set sysfs_ve_perms_set; > > static struct kmem_cache *ve_cachep; > @@ -92,6 +100,9 @@ struct ve_struct ve0 = { > .release_list = LIST_HEAD_INIT(ve0.release_list), > .release_agent_work = __WORK_INITIALIZER(ve0.release_agent_work, > cgroup_release_agent), > + .per_cgroot_list = LIST_HEAD_INIT(ve0.per_cgroot_list), > + .per_cgroot_list_lock = __RAW_SPIN_LOCK_UNLOCKED( > + ve0.per_cgroot_list_lock), > }; > EXPORT_SYMBOL(ve0); > > @@ -118,6 +129,52 @@ void put_ve(struct ve_struct *ve) > } > EXPORT_SYMBOL(put_ve); > > +static struct per_cgroot_data *per_cgroot_data_find_locked( > + struct list_head *per_cgroot_list, struct cgroup *cgroot) > +{ > + struct per_cgroot_data *data; > + > + list_for_each_entry(data, per_cgroot_list, list) { > + if (data->cgroot == cgroot) > + return data; > + } > + return NULL; > +} > + > +static inline struct per_cgroot_data *per_cgroot_get_or_create( > + struct ve_struct *ve, struct cgroup *cgroot) > +{ > + struct per_cgroot_data *data, *other_data; > + > + raw_spin_lock(&ve->per_cgroot_list_lock); > + data = per_cgroot_data_find_locked(&ve->per_cgroot_list, > + cgroot); > + raw_spin_unlock(&ve->per_cgroot_list_lock); > + > + if (data) > + return data; > + > + data = kzalloc(sizeof(struct per_cgroot_data), GFP_KERNEL); > + if (!data) > + return ERR_PTR(-ENOMEM); > + > + raw_spin_lock(&ve->per_cgroot_list_lock); > + other_data = per_cgroot_data_find_locked(&ve->per_cgroot_list, > + cgroot); > + > + if (other_data) { > + raw_spin_unlock(&ve->per_cgroot_list_lock); > + kfree(data); > + return other_data; > + } > + > + data->cgroot = cgroot; > + list_add(&data->list, &ve->per_cgroot_list); > + > + raw_spin_unlock(&ve->per_cgroot_list_lock); > + return data; > +} > + > struct cgroup_subsys_state *ve_get_init_css(struct ve_struct *ve, int > subsys_id) > { > struct cgroup_subsys_state *css, *tmp; > @@ -617,6 +674,17 @@ err_list: > return err; > } > > +static void ve_per_cgroot_free(struct ve_struct *ve) > +{ > + struct per_cgroot_data *data, *saved; New line is needed here. > + raw_spin_lock(&ve->per_cgroot_list_lock); > + list_for_each_entry_safe(data, saved, &ve->per_cgroot_list, list) { > + list_del_init(&data->list); > + kfree(data); > + } > + raw_spin_unlock(&ve->per_cgroot_list_lock); > +} > + > void ve_stop_ns(struct pid_namespace *pid_ns) > { > struct ve_struct *ve = current->task_ve; > @@ -667,6 +735,8 @@ void ve_exit_ns(struct pid_namespace *pid_ns) > > ve_workqueue_stop(ve); > > + ve_per_cgroot_free(ve); > + > /* > * At this point all userspace tasks in container are dead. > */ > @@ -740,6 +810,7 @@ static struct cgroup_subsys_state *ve_create(struct > cgroup *cg) > > INIT_WORK(&ve->release_agent_work, cgroup_release_agent); > raw_spin_lock_init(&ve->release_list_lock); > + raw_spin_lock_init(&ve->per_cgroot_list_lock); > > ve->_randomize_va_space = ve0._randomize_va_space; > > @@ -776,6 +847,7 @@ do_init: > INIT_LIST_HEAD(&ve->ve_list); > INIT_LIST_HEAD(&ve->devmnt_list); > INIT_LIST_HEAD(&ve->release_list); > + INIT_LIST_HEAD(&ve->per_cgroot_list); > mutex_init(&ve->devmnt_mutex); > > #ifdef CONFIG_AIO > _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
