[Devel] [PATCH RHEL10 COMMIT] ve: Switch from ->task_ve to *task_ve() helpers

Konstantin Khorenko khorenko at virtuozzo.com
Mon Dec 1 20:08:08 MSK 2025


The commit is pushed to "branch-rh10-6.12.0-55.13.1.2.x.vz10-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh10-6.12.0-55.13.1.2.21.vz10
------>
commit 91f4d98132e9d426874ba714a946de97d0bd2739
Author: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
Date:   Mon Nov 24 19:20:47 2025 +0800

    ve: Switch from ->task_ve to *task_ve() helpers
    
    In places where we only check ve pointer itself, we may avoid taking the
    reference to ve so we use task_ve() helper there.
    
    In places where we access fields on ve_struct from other task use
    get_task_ve() helper which takes explicit reference to ve_struct.
    
    Also use "__free(put_ve)" cleanup attribute to simplify the reference
    put after get_task_ve().
    
    https://virtuozzo.atlassian.net/browse/VSTOR-118289
    Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
    
    Feature: ve: ve generic structures
    ======
    Patchset description:
    ve: Add VE namespace
    
    Main ideas behind VE namespace explained in "ve: Introduce VE
    namespace".
---
 block/ioprio.c              | 5 +++--
 drivers/connector/cn_proc.c | 2 +-
 kernel/sched/stats.c        | 4 +++-
 kernel/sys.c                | 2 +-
 kernel/ve/ve.c              | 4 ++--
 kernel/ve/vzstat.c          | 4 +++-
 6 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/block/ioprio.c b/block/ioprio.c
index db515442089ac..3c7a417b1e90f 100644
--- a/block/ioprio.c
+++ b/block/ioprio.c
@@ -29,6 +29,7 @@
 #include <linux/syscalls.h>
 #include <linux/security.h>
 #include <linux/pid_namespace.h>
+#include <linux/ve.h>
 
 int ioprio_check_cap(int ioprio)
 {
@@ -136,7 +137,7 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
 
 			for_each_process_thread(g, p) {
 #ifdef CONFIG_VE
-				if (p->task_ve != get_exec_env())
+				if (task_ve(p) != get_exec_env())
 					continue;
 #endif
 				if (!uid_eq(task_uid(p), uid) ||
@@ -250,7 +251,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
 
 			for_each_process_thread(g, p) {
 #ifdef CONFIG_VE
-				if (p->task_ve != get_exec_env())
+				if (task_ve(p) != get_exec_env())
 					continue;
 #endif
 				if (!uid_eq(task_uid(p), user->uid) ||
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c
index eb280258b5b6b..d41c8aca1866b 100644
--- a/drivers/connector/cn_proc.c
+++ b/drivers/connector/cn_proc.c
@@ -181,7 +181,7 @@ static void proc_event_connector(struct task_struct *task,
 						    struct task_struct *task,
 						    long cookie))
 {
-	struct ve_struct *ve = task->task_ve;
+	struct ve_struct *ve __free(put_ve) = get_task_ve(task);
 
 	if (!ve_is_super(ve))
 		proc_event_connector_ve(task, ve, what, cookie, fill_event);
diff --git a/kernel/sched/stats.c b/kernel/sched/stats.c
index 15a2f1063fbe2..7c3f311b416d0 100644
--- a/kernel/sched/stats.c
+++ b/kernel/sched/stats.c
@@ -22,8 +22,10 @@ void __update_stats_wait_start(struct rq *rq, struct task_struct *p,
 static inline void update_sched_lat(struct task_struct *t, u64 delta, u64 now)
 {
 #ifdef CONFIG_VE
+	struct ve_struct *ve __free(put_ve) = get_task_ve(t);
+
 	KSTAT_LAT_PCPU_ADD(&kstat_glob.sched_lat, delta);
-	KSTAT_LAT_PCPU_ADD(&t->task_ve->sched_lat_ve, delta);
+	KSTAT_LAT_PCPU_ADD(&ve->sched_lat_ve, delta);
 
 	t->alloc_lat[KSTAT_SCHED].totlat += delta;
 	t->alloc_lat[KSTAT_SCHED].count++;
diff --git a/kernel/sys.c b/kernel/sys.c
index fce3d2d4350a6..a2a6722f9fe5b 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -2319,7 +2319,7 @@ static int prctl_set_task_ct_fields(struct task_struct *t, unsigned long arg,
 {
 	struct prctl_task_ct_fields params;
 #ifdef CONFIG_VE
-	struct ve_struct *ve = t->task_ve;
+	struct ve_struct *ve __free(put_ve) = get_task_ve(t);
 
 	if (!ve_is_super(ve) && !ve->is_pseudosuper)
 		return -EPERM;
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index ba0d64dea7b2e..b96c752607a28 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -797,7 +797,7 @@ void ve_stop_ns(struct pid_namespace *pid_ns)
 	ve_nsproxy = rcu_dereference_protected(ve->ve_nsproxy, lockdep_is_held(&ve->op_sem));
 	/*
 	 * current->cgroups already switched to init_css_set in cgroup_exit(),
-	 * but current->task_ve still points to our exec ve.
+	 * but get_exec_env() still points to our exec ve.
 	 */
 	if (!ve_nsproxy || ve_nsproxy->pid_ns_for_children != pid_ns)
 		goto unlock;
@@ -1784,7 +1784,7 @@ static ssize_t ve_write_ctty(struct kernfs_open_file *of, char *buf,
 			goto out;
 		}
 
-		if (tsk_from->task_ve == tsk_to->task_ve) {
+		if (task_ve(tsk_from) == task_ve(tsk_to)) {
 			spin_lock_irqsave(&tsk_to->sighand->siglock, flags);
 			tty_to = tsk_to->signal->tty;
 			if (!tty_to)
diff --git a/kernel/ve/vzstat.c b/kernel/ve/vzstat.c
index 8420adba3af5f..46ac756ba21d0 100644
--- a/kernel/ve/vzstat.c
+++ b/kernel/ve/vzstat.c
@@ -121,13 +121,15 @@ static void update_max_sched_latency_snap(void)
 	read_lock(&tasklist_lock);
 	now = ktime_to_ns(ktime_get());
 	for_each_process_thread(g, t) {
+		struct ve_struct *ve __free(put_ve) = NULL;
 		if (likely(t->__state != TASK_RUNNING))
 			continue;
 
 		tmp = get_task_lat(t, now);
 		if (max < tmp)
 			max = tmp;
-		st = &t->task_ve->sched_lat_ve;
+		ve = get_task_ve(t);
+		st = &ve->sched_lat_ve;
 		if (st->max_snap < tmp)
 			st->max_snap = tmp;
 	}


More information about the Devel mailing list