[Devel] [PATCH vz10 20/32] ve: compile the per-Container VDSO copies only on x86
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Aug 21 19:37:06 MSK 2026
From: Eva Kurchatova <eva.kurchatova at virtuozzo.com>
Every Container gets its own copy of the VDSO images so that the Linux
version code inside them can be patched to whatever the Container's
os_release says. All of that is built on vdso_image_64 / vdso_image_32,
which exist on x86 only, while kernel/ve/ve.c is generic code - so the
file does not compile on an architecture without them, User Mode Linux
being the one we now want for KUnit:
kernel/ve/ve.c: error: 'vdso_image_64' undeclared here
(not in a function)
Guard the ve0 initializer, copy_vdso()/ve_free_vdso() and their callers
with CONFIG_X86, and give ve_free_vdso() a no-op stub so the error path of
ve_create() stays as it is. Its err_vdso label stays reachable either
way, since ve_mount_devtmpfs() jumps to it too. A Container on an
architecture without a patchable VDSO simply keeps the host's.
Feature: mm: vdso virtualization
https://virtuozzo.atlassian.net/browse/VSTOR-134732
Signed-off-by: Eva Kurchatova <eva.kurchatova at virtuozzo.com>
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
kernel/ve/ve.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index 73d1c3b4873e..3a9f3841fe55 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -85,8 +85,10 @@ struct ve_struct ve0 = {
.meminfo_val = VE_MEMINFO_SYSTEM,
.umh_running_helpers = ATOMIC_INIT(0),
.umh_helpers_waitq = __WAIT_QUEUE_HEAD_INITIALIZER(ve0.umh_helpers_waitq),
+#ifdef CONFIG_X86
.vdso_64 = (struct vdso_image*)&vdso_image_64,
.vdso_32 = (struct vdso_image*)&vdso_image_32,
+#endif
};
EXPORT_SYMBOL(ve0);
@@ -675,6 +677,7 @@ u64 ve_get_uptime(struct ve_struct *ve)
}
EXPORT_SYMBOL(ve_get_uptime);
+#ifdef CONFIG_X86
static int copy_vdso(struct vdso_image **vdso_dst, const struct vdso_image *vdso_src)
{
struct vdso_image *vdso;
@@ -712,6 +715,9 @@ static void ve_free_vdso(struct ve_struct *ve)
kfree(ve->vdso_32);
}
}
+#else
+static inline void ve_free_vdso(struct ve_struct *ve) { }
+#endif
static struct cgroup_subsys_state *ve_create(struct cgroup_subsys_state *parent_css)
{
@@ -758,6 +764,7 @@ static struct cgroup_subsys_state *ve_create(struct cgroup_subsys_state *parent_
if (err)
goto err_log;
+#ifdef CONFIG_X86
err = copy_vdso(&ve->vdso_64, &vdso_image_64);
if (err)
goto err_vdso;
@@ -765,6 +772,7 @@ static struct cgroup_subsys_state *ve_create(struct cgroup_subsys_state *parent_
err = copy_vdso(&ve->vdso_32, &vdso_image_32);
if (err)
goto err_vdso;
+#endif
err = ve_mount_devtmpfs(ve);
if (err)
@@ -1158,8 +1166,10 @@ static ssize_t ve_os_release_write(struct kernfs_open_file *of, char *buf,
if (sscanf(buf, "%d.%d.%d", &n1, &n2, &n3) == 3) {
new_version = ((n1 << 16) + (n2 << 8)) + n3;
+#ifdef CONFIG_X86
*((int *)(ve->vdso_64->data + ve->vdso_64->sym_linux_version_code)) = new_version;
*((int *)(ve->vdso_32->data + ve->vdso_32->sym_linux_version_code)) = new_version;
+#endif
}
down_write(&uts_sem);
--
2.47.1
More information about the Devel
mailing list