From: Vladimir Riabchun <vladimir.riabchun@virtuozzo.com>
To: ptikhomirov@virtuozzo.com, Konstantin Khorenko <khorenko@virtuozzo.com>
Cc: devel@openvz.org
Subject: [Devel] [PATCH hci-8.1 2/2] selftests: ve: Test sched_getaffinity in VE
Date: Tue, 27 Oct 2026 21:51:11 +0100 [thread overview]
Message-ID: <20261027-ct-invalid-nrpoc-v1-2-48727c3afe16@virtuozzo.com> (raw)
In-Reply-To: <20261027-ct-invalid-nrpoc-v1-0-48727c3afe16@virtuozzo.com>
Add a new selftest that verifies that sched_getaffinity respects both
cgroup cpuset and nr_cpus limits.
https://virtuozzo.atlassian.net/browse/VSTOR-141682
Signed-off-by: Vladimir Riabchun <vladimir.riabchun@virtuozzo.com>
---
tools/testing/selftests/ve/.gitignore | 1 +
tools/testing/selftests/ve/Makefile | 1 +
.../selftests/ve/ve_sched_getaffinity_test.c | 147 +++++++++++++++++++++
3 files changed, 149 insertions(+)
diff --git a/tools/testing/selftests/ve/.gitignore b/tools/testing/selftests/ve/.gitignore
index 8ab1bfe6f5e4..178de0ee1822 100644
--- a/tools/testing/selftests/ve/.gitignore
+++ b/tools/testing/selftests/ve/.gitignore
@@ -3,3 +3,4 @@ ve_perms_test
ve_mount_accounting_test
ve_cpuid_override_test
ve_vtty_stress
+ve_sched_getaffinity_test
diff --git a/tools/testing/selftests/ve/Makefile b/tools/testing/selftests/ve/Makefile
index 51f9316beb99..d53e724205f7 100644
--- a/tools/testing/selftests/ve/Makefile
+++ b/tools/testing/selftests/ve/Makefile
@@ -6,6 +6,7 @@ TEST_GEN_PROGS += ve_ns_owner_test
TEST_GEN_PROGS += ve_perms_test
TEST_GEN_PROGS += ve_mount_accounting_test
TEST_GEN_PROGS += ve_vtty_stress
+TEST_GEN_PROGS += ve_sched_getaffinity_test
# CPUID faulting is x86-64 only. ARCH says "x86" for 32-bit too and lib.mk
# picks the clang target by its emptiness, so decide by the compiler.
diff --git a/tools/testing/selftests/ve/ve_sched_getaffinity_test.c b/tools/testing/selftests/ve/ve_sched_getaffinity_test.c
new file mode 100644
index 000000000000..a47cee832c3b
--- /dev/null
+++ b/tools/testing/selftests/ve/ve_sched_getaffinity_test.c
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * ve_mount_accounting selftests
+ *
+ * Tests to check cpuset virtualization.
+ */
+#define _GNU_SOURCE
+#include <asm/unistd.h>
+#include <linux/sched.h>
+#include <linux/limits.h>
+#include <sys/wait.h>
+#include <sys/syscall.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+
+#include "../kselftest_harness.h"
+#include "ve_selftest.h"
+
+FIXTURE(ve_getaff_test)
+{
+ int cgv2_fd;
+ int ctid;
+ struct namespace_ctx ns_ctx;
+};
+
+static int __getaffinity_ve(void *cpuset)
+{
+ cpu_set_t *dst = cpuset;
+
+ return sched_getaffinity(getpid(), sizeof(*dst), dst);
+}
+
+static int getaffinity_ve(FIXTURE_DATA(ve_getaff_test) * self, cpu_set_t *dst)
+{
+ int ret = -1;
+ cpu_set_t *tmp = mmap(NULL, sizeof(cpu_set_t),
+ PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+
+ if (tmp == MAP_FAILED) {
+ fprintf(stderr, "Failed to mmap shared region: %s\n", strerror(errno));
+ return -1;
+ }
+ CPU_ZERO(tmp);
+ CPU_ZERO(dst);
+
+ ret = run_in_ve(self->cgv2_fd, self->ctid, &self->ns_ctx,
+ CLONE_NEWVE, __getaffinity_ve, tmp);
+
+ if (!ret)
+ memcpy(dst, tmp, sizeof(cpu_set_t));
+
+ munmap(tmp, sizeof(cpu_set_t));
+ return ret;
+}
+
+FIXTURE_SETUP(ve_getaff_test)
+{
+ cpu_set_t this, in_ve;
+
+ self->cgv2_fd = mount_cg2_fd();
+ ASSERT_GE(self->cgv2_fd, 0);
+
+ ASSERT_EQ(write_file_at(self->cgv2_fd, "cgroup.subtree_control",
+ VE_CONTROLLERS), 0);
+
+ self->ctid = make_ve(self->cgv2_fd, CTID_MIN);
+ ASSERT_GE(self->ctid, 0);
+
+ ASSERT_EQ(prepare_namespaces(&self->ns_ctx, CLONE_NEWVE,
+ self->cgv2_fd, self->ctid), 0);
+
+
+ ASSERT_EQ(sched_getaffinity(getpid(), sizeof(this), &this), 0);
+ if (CPU_COUNT(&this) < 2)
+ SKIP(return, "Not enough CPUs available");
+
+ /* Chech that we are talking about the same CPUs */
+ ASSERT_EQ(getaffinity_ve(self, &in_ve), 0);
+ ASSERT_TRUE(CPU_EQUAL(&this, &in_ve));
+};
+
+FIXTURE_TEARDOWN(ve_getaff_test)
+{
+ close_namespace_fds(&self->ns_ctx);
+ destroy_ve(self->cgv2_fd, self->ctid);
+ close(self->cgv2_fd);
+}
+
+/* Test correct processing of cpuset.cpus updates */
+TEST_F(ve_getaff_test, update_cg_cpuset)
+{
+ char path[PATH_MAX];
+ int cpu_victim = 0;
+ cpu_set_t in_ve;
+
+ snprintf(path, sizeof(path), "%d/cpuset.cpus", self->ctid);
+ if (faccessat(self->cgv2_fd, path, F_OK, 0))
+ SKIP(return, "CT cgroup doesn't have cpuset.cpus entry");
+
+ ASSERT_EQ(getaffinity_ve(self, &in_ve), 0);
+
+ /* Find one CPU and leave it alone via cgroup interface */
+ while (!CPU_ISSET(cpu_victim, &in_ve))
+ cpu_victim++;
+
+ ASSERT_EQ(write_u64_at(self->cgv2_fd, path, cpu_victim), 0);
+
+ /* Verify sched_getaffinity sees updated value */
+ ASSERT_EQ(getaffinity_ve(self, &in_ve), 0);
+ ASSERT_EQ(CPU_COUNT(&in_ve), 1);
+ ASSERT_TRUE(CPU_ISSET(cpu_victim, &in_ve));
+}
+
+/* Test correct processing of cpu.nr_cpus updates */
+TEST_F(ve_getaff_test, nr_proc_bound)
+{
+ char path[PATH_MAX];
+ int cpu_victim = 0;
+ cpu_set_t in_ve;
+
+ snprintf(path, sizeof(path), "%d/cpu.nr_cpus", self->ctid);
+ if (faccessat(self->cgv2_fd, path, F_OK, 0))
+ SKIP(return, "CT cgroup doesn't have cpu.nr_cpus entry");
+
+ ASSERT_EQ(getaffinity_ve(self, &in_ve), 0);
+
+ /* Find one CPU and bound nr_cpus by its value */
+ while (!CPU_ISSET(cpu_victim, &in_ve))
+ cpu_victim++;
+
+ ASSERT_EQ(write_u64_at(self->cgv2_fd, path, cpu_victim + 1), 0);
+
+ /* Verify sched_getaffinity sees only one CPU */
+ ASSERT_EQ(getaffinity_ve(self, &in_ve), 0);
+ ASSERT_EQ(CPU_COUNT(&in_ve), 1);
+ ASSERT_TRUE(CPU_ISSET(cpu_victim, &in_ve));
+}
+
+TEST_HARNESS_MAIN
--
2.52.0
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel
prev parent reply other threads:[~2026-10-27 20:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-27 20:51 [Devel] [PATCH hci-8.1 0/2] sched: Fix incorrect nproc report inside CT Vladimir Riabchun
2026-10-27 20:51 ` [Devel] [PATCH hci-8.1 1/2] sched: Fix sched_getaffinity syscall Vladimir Riabchun
2026-10-28 9:34 ` Pavel Tikhomirov
2026-10-28 10:30 ` Vladimir Riabchun
2026-10-27 20:51 ` Vladimir Riabchun [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261027-ct-invalid-nrpoc-v1-2-48727c3afe16@virtuozzo.com \
--to=vladimir.riabchun@virtuozzo.com \
--cc=devel@openvz.org \
--cc=khorenko@virtuozzo.com \
--cc=ptikhomirov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.