[Devel] [PATCH VZ10 v2 05/12] ve_namespace: Move cgroup ve_attach() operations to namespace join path

Konstantin Khorenko khorenko at virtuozzo.com
Fri Dec 12 18:44:52 MSK 2025


On 12/10/25 11:34, Pavel Tikhomirov wrote:
> Move operations previously done in the process of joining ve cgroup in
> ve_attach() to ve_setup_task() helper and call it from ve namespace join
> paths.
> 
> This is another step in making the process' ve to be namespace based,
> similar to what we did for ->task_ve.
> 
> https://virtuozzo.atlassian.net/browse/VSTOR-119941
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> 
> Feature: ve: ve generic structures
> ---
>   include/linux/ve.h       |  4 ++++
>   kernel/ve/ve.c           | 52 +++++++++++++++++++---------------------
>   kernel/ve/ve_namespace.c |  5 ++++
>   3 files changed, 33 insertions(+), 28 deletions(-)
> 
> diff --git a/include/linux/ve.h b/include/linux/ve.h
> index cd0e855d38f1..4a42f16c259a 100644
> --- a/include/linux/ve.h
> +++ b/include/linux/ve.h
> @@ -275,6 +275,8 @@ int ve_net_hide_sysctl(struct net *net);
>   
>   extern bool is_ve_init_net(const struct net *net);
>   
> +void ve_setup_task(struct task_struct *p, struct ve_struct *ve);
> +
>   #else	/* CONFIG_VE */
>   #include <linux/init_task.h>
>   #define get_ve(ve)	((void)(ve), NULL)
> @@ -330,6 +332,8 @@ static inline struct cgroup_subsys_state *css_ve_root1(
>   static inline int vz_security_family_check(struct net *net, int family, int type) { return 0; }
>   static inline int vz_security_protocol_check(struct net *net, int protocol) { return 0; }
>   
> +static inline void ve_setup_task(struct task_struct *p, struct ve_struct *ve) { }
> +
>   #endif	/* CONFIG_VE */
>   
>   struct seq_file;
> diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
> index 5d28d78a74da..61448af310c7 100644
> --- a/kernel/ve/ve.c
> +++ b/kernel/ve/ve.c
> @@ -1171,33 +1171,6 @@ static int ve_can_attach(struct cgroup_taskset *tset)
>   	return ve_is_attachable(tset);
>   }
>   
> -static void ve_attach(struct cgroup_taskset *tset)
> -{
> -	struct cgroup_subsys_state *css;
> -	struct task_struct *task;
> -	extern struct cpuid_override_table __rcu *cpuid_override;
> -
> -	cgroup_taskset_for_each(task, css, tset) {
> -		struct ve_struct *ve = css_to_ve(css);
> -
> -		/* this probihibts ptracing of task entered to VE from host system */

probihits

> -		if (VE_IS_RUNNING(ve) && task->mm)
> -			task->mm->vps_dumpable = VD_VE_ENTER_TASK;
> -
> -		/* Drop OOM protection. */
> -		task->signal->oom_score_adj = 0;
> -		task->signal->oom_score_adj_min = 0;
> -
> -		/* Leave parent exec domain */
> -		task->parent_exec_id--;
> -
> -		ve_set_task_start_time(ve, task);
> -
> -		if (cpuid_override_on())
> -			set_tsk_thread_flag(task, TIF_CPUID_OVERRIDE);
> -	}
> -}
> -
>   static int ve_state_show(struct seq_file *sf, void *v)
>   {
>   	struct cgroup_subsys_state *css = seq_css(sf);
> @@ -1904,7 +1877,6 @@ struct cgroup_subsys ve_cgrp_subsys = {
>   	.css_offline	= ve_offline,
>   	.css_free	= ve_destroy,
>   	.can_attach	= ve_can_attach,
> -	.attach		= ve_attach,
>   	.legacy_cftypes	= ve_cftypes,
>   	.dfl_cftypes	= ve_cftypes,
>   };
> @@ -2051,4 +2023,28 @@ int ve_get_cpu_stat(struct ve_struct *ve, struct kernel_cpustat *kstat)
>   	return err;
>   }
>   EXPORT_SYMBOL(ve_get_cpu_stat);
> +
> +void ve_setup_task(struct task_struct *task, struct ve_struct *ve)
> +{
> +	if (ve == &ve0)
> +		return;
> +
> +	/* this probihibts ptracing of task entered to VE from host system */
> +	if (VE_IS_RUNNING(ve) && task->mm)
> +		task->mm->vps_dumpable = VD_VE_ENTER_TASK;
> +
> +	/* Drop OOM protection. */
> +	task->signal->oom_score_adj = 0;
> +	task->signal->oom_score_adj_min = 0;
> +
> +	/* Leave parent exec domain */
> +	task->parent_exec_id--;
> +
> +	ve_set_task_start_time(ve, task);
> +
> +	if (cpuid_override_on())
> +		set_tsk_thread_flag(task, TIF_CPUID_OVERRIDE);
> +}
> +EXPORT_SYMBOL(ve_setup_task);
> +
>   #endif /* CONFIG_CGROUP_SCHED */
> diff --git a/kernel/ve/ve_namespace.c b/kernel/ve/ve_namespace.c
> index 9df82c95f3d5..c8f89f57ab03 100644
> --- a/kernel/ve/ve_namespace.c
> +++ b/kernel/ve/ve_namespace.c
> @@ -92,6 +92,9 @@ int copy_ve_ns(unsigned long flags, struct task_struct *p)
>   
>   	p->ve_ns = new_ve_ns;
>   	p->task_ve = new_ve_ns->ve;
> +
> +	ve_setup_task(p, p->task_ve);
> +
>   	return 0;
>   }
>   
> @@ -143,6 +146,8 @@ void switch_ve_namespace(struct task_struct *p, struct ve_namespace *new)
>   
>   	if (old)
>   		put_ve_ns(old);
> +
> +	ve_setup_task(p, p->task_ve);
>   }
>   
>   void exit_ve_namespace(struct task_struct *p)



More information about the Devel mailing list