From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (unknown [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 3BD188015D for ; Tue, 15 Sep 2026 14:49:06 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 68FElmua005898; Tue, 15 Sep 2026 17:47:49 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68FElmua005898 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="F1omRUuR" Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 68FElhMs005887 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Tue, 15 Sep 2026 17:47:43 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68FElhMs005887 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-48701401090so1432245f8f.3 for ; Tue, 15 Sep 2026 07:47:43 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvByn+/edMRMyvXItHuYVaYENM1WtKOEM3PnNDZM7xGNZVLWTk+qf+Y9KtAPN3YWawOpEYYyhOA==@openvz.org X-Gm-Message-State: AFuF++mXJNayKdUREBgAXd59LUTRLKSfhDPAwPOXKaUJxacpkezfIP32 HPUlHxSE12ckoqV362W/nHvogje7IDXISQklraQfaZh76UvAie1XtXCeBkgu5fDya1eb18Geb5D onf9QkgkDj0EEwrHzypFpKn4PMnAx2YVvpXx1TGyGEhs3dhOKKA+SvA== X-Gm-Gg: AYBFou0CxxXGij5GlQ+VqV2IGpym5+nFZCly7Y3S+5HKckdj8q12X5GrZisMevsxcp8 YmKpvs2BQ7vTs0y8e8dOVUczJOveYx32v6cYrVsXwiO3A9+LcKLzU4bh5IUwnXN58Fsk2ONVlYB NKcNllBqR/VtxuFVNn59zTQvbULwRB64LE14vdl2vvw3l9MbSSC2+l2//A2J5qaTOVwwvNPs/xw L3viykxqKT2Z6IgTzWgvYZ+QyDrnUxlRFPFyY+bGMl4cPawG6hoNZ4fLew3pFqcjWyRPXYeEawC 21mC/edazkxSKalUIOPHfEUzRKpbiAKhAQLVs+QJ0aT8fUyLhavq63fULkFYjDiqI46gjbYKN0E bVaBcJL+LhnAhmhRJXGLnb8Gq4WQWzgY= X-Received: by 2002:a05:6000:2283:b0:487:635:bae2 with SMTP id ffacd0b85a97d-4870635bc41mr10054883f8f.25.1789483663208; Tue, 15 Sep 2026 07:47:43 -0700 (PDT) X-Received: by 2002:a05:6000:2283:b0:487:635:bae2 with SMTP id ffacd0b85a97d-4870635bc41mr10054765f8f.25.1789483662602; Tue, 15 Sep 2026 07:47:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1789483662; cv=none; d=google.com; s=arc-20260327; b=Nrpetat5ksI3LPxJkytcBK4Q52i1R3c85CGCavu8Ri6Gz8yCXDI/yCTUNQD9vgP/AY NBKuIDRucyrQ1KpRJLLxIeRX+RlUCnBlHAQkuWTZtPriLfsaiYD1T46cJT6wq+JO17mf a9jSbzcaSCic/jYqDEykDKDXY9Ew26p1sfnnEyYn+FbMLPGvU7mRqr0bLVuksPLwN2UU 5dRrixK2GK0ZRBi9siAxo/FLIBeA6Vv2TM7Mkt1waoZCxuM3WQZ888HPEP3oXbfpgE/W 0/NAYRmJ6Rl7qr5ZbYWMmG6YZB8tWpIuzd/UaQB3A3BjciKg+e/s39rxJX/VQMlOycvq SALw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=message-id:date:references:in-reply-to:cc:to:from:subject :content-transfer-encoding:mime-version:dkim-signature; bh=i3DETKfEJdsMca9oVFh68WDlxktCtxIPOI/ugYGoZPc=; fh=CTF2GHyV+XdzB5TROrdG4fdLri6JSHNOBC+LNuNq5bA=; b=QOeccV8D9k9CTt/WacvF+mqBs/eIYvoliz23K9KKt5zkMsCssjIxcNDr+/RsF46SkR av7nVzYGRyNLjhMxnnr98wkNqED3p4ABe4D7WQvap8/+nC6kut8ghfaLPOi9alZTXkr+ XxWnh75Xj733nPEFBBNu5u/IyArfAVXIYgt1StNKq1yHpjhDIjUi5mHp+M7AFP3q4QXm tFq6bPK8bySf4+F8gOM3WbFeB2yKAis3L4hrMFrFhgG24nbln+WdI89bkjTQvR8OiSDI GgWdIVWOsv5Mz14WwYIuh5LmAHciamOadeh3rvdgN0MAit3tNXsDZEtE8IF+VPwiG//o RscQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=F1omRUuR; spf=pass (google.com: domain of vasileios.almpanis@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=vasileios.almpanis@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id ffacd0b85a97d-486eb2f3aafsi25174611f8f.27.2026.09.15.07.47.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 07:47:42 -0700 (PDT) Received-SPF: pass (google.com: domain of vasileios.almpanis@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=F1omRUuR; spf=pass (google.com: domain of vasileios.almpanis@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=vasileios.almpanis@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=Message-Id:Date:From:Subject:Content-Type: MIME-Version; bh=i3DETKfEJdsMca9oVFh68WDlxktCtxIPOI/ugYGoZPc=; b=F1omRUuRs+SJ YIJodmrE236P6u+1i7RsBNA5pcGHSEjMxBe1FPqQq9tVuwoib+XD2hB0lXgXQgWbEmGOongcwnf0p 8iaVZugLdr40EdzVpN1vrJqhvP0fKrlcToaqc7TXTkvudYuJU/sMi2lQYYN7dAxwmRaUrElW3zvhp lI6JIfM0my/hF5As04lOTPSmBQ78bYjKDLtQRyQBPIjergvxrUCxcqWNNsFC+KEhFJWW9k2lLPbOq eMn/wfAYimkOdT5AmUDhy12z7hDh8ktvKFPD1nDEvztJa4dbNKTvtZ3USIenIk+U6PZIdKhZQnLBr V3pgiRVvpQJ3WQ+HiMgBJA==; Received: from [130.117.225.5] (helo=dev010.ch-qa.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1x6UOy-00DV93-30; Tue, 15 Sep 2026 16:47:32 +0200 MIME-Version: 1.0 From: Vasileios Almpanis To: Eva Kurchatova In-Reply-To: <20260914091631.631032-2-eva.kurchatova@virtuozzo.com> References: <20260914091631.631032-1-eva.kurchatova@virtuozzo.com> <20260914091631.631032-2-eva.kurchatova@virtuozzo.com> Date: Tue, 15 Sep 2026 14:47:40 +0000 Message-Id: <178948366015.154373.11003308058039145937.b4-review@b4> X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789483661; l=7907; i=vasileios.almpanis@virtuozzo.com; s=20260812; h=from:subject:message-id; bh=1QCRlepTJEf2JG2qTAUOy2XcFlpLvOfMBPd2kWdX2Bo=; b=EWZT5WY6xu0g1tMC+anhtmO2bFJFqFx1S/ceYQW/DkuCmHEu+BxO2N0u9Kr8F3+8hz4N/8VxP XFFZKFNcF+rCeRgYX7lg2w6H3TACac+D7ibUyXbChI3hcH+XLc0XvYD X-Developer-Key: i=vasileios.almpanis@virtuozzo.com; a=ed25519; pk=HhuHDXAcPva9A8zccWEMRsb36reu+y4IVbBjXKxNUjw= X-OZ-Fwd: true Cc: devel@openvz.org Subject: Re: [Devel] [PATCH vz10 2/2] selftests: ve: introduce vtty pair teardown stress test X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org > A vtty pair is created by the first master open and torn down by the > last close. The close racing the peer's close used to let both sides > decide they were the final one and call release_tty() twice, and a > master opening again while a teardown was in flight used to hand out a > reference to a tty_struct about to be freed. > > Hammer both ends. The master comes from the vzctl ioctl, which does > not look the VE up. The slave is only reachable from inside the VE, as > TTY_MAJOR minor 1..MAX_NR_VTTY_CONSOLES, which vtty_driver() maps to > vttys index minor - 1, so the test builds a VE with cgroup2, sets > ve.veid to the cgroup it made, and runs the slave side there. > > One of the symtoms of a buggy kernel is dmesg warning, not just an > eventual crash, so the test checks that. A crashed node should also > report test failure in CI, but that's less verbose, hence the check. > > https://virtuozzo.atlassian.net/browse/VSTOR-144771 > > Feature: ve selftest > Signed-off-by: Eva Kurchatova > > diff --git a/tools/testing/selftests/ve/Makefile b/tools/testing/selftests/ve/Makefile > index ec40cbc7b3a1..6cd5823c4d93 100644 > --- a/tools/testing/selftests/ve/Makefile > +++ b/tools/testing/selftests/ve/Makefile > @@ -4,5 +4,6 @@ CFLAGS += -g -Wall -O2 > > TEST_GEN_PROGS += ve_ns_owner_test > TEST_GEN_PROGS += ve_perms_test > +TEST_GEN_PROGS += ve_vtty_stress Please add to .gitignore too > > include ../lib.mk > diff --git a/tools/testing/selftests/ve/settings b/tools/testing/selftests/ve/settings > new file mode 100644 > index 000000000000..e2206265f67c > --- /dev/null > +++ b/tools/testing/selftests/ve/settings > @@ -0,0 +1 @@ > +timeout=900 > diff --git a/tools/testing/selftests/ve/ve_vtty_stress.c b/tools/testing/selftests/ve/ve_vtty_stress.c > new file mode 100644 > index 000000000000..9037f731c58d > --- /dev/null > +++ b/tools/testing/selftests/ve/ve_vtty_stress.c > @@ -0,0 +1,244 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * ve_vtty_stress - close a vtty pair from both ends at once. > + * > + * A vtty pair is created by the first master open and torn down by the > + * last close. A close racing the peer's close used to let both sides > + * decide they were the final one and call release_tty() twice, and a > + * master opened again while a teardown was still in flight used to hand > + * out a reference to a tty_struct that was about to be freed. Either > + * way the next close walked freed memory. > + * > + * The master comes from the vzctl ioctl, which does not look the VE up. > + * The slave is only reachable from inside the VE, as TTY_MAJOR minor > + * 1..MAX_NR_VTTY_CONSOLES, which vtty_driver() maps to vttys index > + * minor - 1. So the test makes a VE with cgroup2, hammers the master > + * from the host and the slave from a task inside it, and fails if the > + * kernel logs a complaint about the teardown. > + * > + * Surviving is not a pass on its own: the first symptom is a warning, > + * which stops nothing by itself. > + * > + * Usage: ve_vtty_stress [seconds] (default 600, or $VE_VTTY_SECS) > + */ > +#define _GNU_SOURCE > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "ve_selftest.h" > +#include "../kselftest.h" > + > +/* The ioctl argument; the trailing data[] the uapi struct has is unused. */ > +struct vzctl_ve_configure { > + unsigned int veid, key, val, size; > +}; > + > +#define VZCTL_VE_CONFIGURE _IOW('.', 15, struct vzctl_ve_configure) > +#define VE_CONFIGURE_OPEN_TTY 5 > + > +#define VTTY_IDX 0 /* the pair both ends work on */ > +#define SLAVE_MINOR (VTTY_IDX + 1) /* vtty_driver(): index = minor - 1 */ > +#define DEFAULT_SECS 600 > + > +static int open_master(int ctl_fd, unsigned int veid) > +{ > + struct vzctl_ve_configure c = { > + .veid = veid, .key = VE_CONFIGURE_OPEN_TTY, .val = VTTY_IDX, > + }; > + > + return ioctl(ctl_fd, VZCTL_VE_CONFIGURE, &c); > +} > + > +/* > + * The slave end, inside the VE. Every error here is one the race is > + * expected to produce: the pair is gone once the master has closed it. > + */ > +static int hammer_slave(time_t deadline, unsigned long *opened) > +{ > + char node[] = "/tmp/ve_vtty_slave"; > + > + unlink(node); > + if (mknod(node, S_IFCHR | 0600, makedev(TTY_MAJOR, SLAVE_MINOR)) < 0) > + return -1; > + > + while (time(NULL) < deadline) { > + int fd = open(node, O_RDWR | O_NOCTTY | O_NONBLOCK); > + > + if (fd >= 0) { > + (*opened)++; > + close(fd); > + } > + } > + unlink(node); > + return 0; > +} > + > +/* The kernel log, since a warning fails nothing by itself. */ > +static int kmsg_open(void) > +{ > + int fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); > + > + if (fd >= 0) > + lseek(fd, 0, SEEK_END); > + return fd; > +} > + > +static int kmsg_check(int fd) > +{ > + static const char * const ours[] = { > + "tty_release", "release_tty", "check_tty_count", > + "vtty_open_master", "vtty_shutdown", > + }; > + char buf[8192]; > + int found = 0; > + ssize_t r; > + size_t i; > + > + while (fd >= 0 && (r = read(fd, buf, sizeof(buf) - 1)) > 0) { > + buf[r] = '\0'; > + if (!strstr(buf, "WARNING") && !strstr(buf, "BUG") && > + !strstr(buf, "Oops") && !strstr(buf, "general protection")) > + continue; > + for (i = 0; i < ARRAY_SIZE(ours); i++) > + if (strstr(buf, ours[i])) { > + ksft_print_msg("kernel log: %s", buf); > + found++; > + break; > + } > + } > + return found; > +} > + > +int main(int argc, char **argv) > +{ > + unsigned long master_opened = 0, slave_opened = 0; > + int cg, ctid, ctl, kmsg, ready[2], count[2], status; > + const char *env = getenv("VE_VTTY_SECS"); > + char path[PATH_MAX], val[16], c; > + time_t deadline; > + long secs; > + pid_t pid; > + > + ksft_print_header(); > + secs = argc > 1 ? atol(argv[1]) : (env ? atol(env) : DEFAULT_SECS); > + if (secs <= 0) > + secs = DEFAULT_SECS; > + > + ctl = open("/dev/vzctl", O_RDWR); > + if (ctl < 0) > + ksft_exit_skip("cannot open /dev/vzctl: %s, the vz modules " > + "(vzdev, vzmon) are needed\n", strerror(errno)); > + > + cg = mount_cg2_fd(); > + if (cg < 0) > + ksft_exit_skip("cannot mount cgroup2: %s\n", strerror(errno)); > + write_file_at(cg, "cgroup.subtree_control", VE_CONTROLLERS); > + > + ctid = make_ve(cg, CTID_MIN); > + if (ctid < 0) > + ksft_exit_skip("cannot make a VE cgroup\n"); > + > + /* > + * The pair is filed under the veid of the VE, so the two ends only > + * meet if the cgroup carries the one the master is opened for. > + */ > + snprintf(path, sizeof(path), "%d/ve.veid", ctid); > + snprintf(val, sizeof(val), "%d", ctid); > + if (write_file_at(cg, path, val) < 0) { > + destroy_ve(cg, ctid); > + ksft_exit_skip("cannot set ve.veid: %s\n", strerror(errno)); > + } > + > + /* Do not report a failure where the vtty pair cannot be had at all. */ > + status = open_master(ctl, ctid); > + if (status < 0 && errno != EBUSY) { > + destroy_ve(cg, ctid); > + ksft_exit_skip("no vtty master: %s\n", strerror(errno)); > + } > + if (status >= 0) > + close(status); > + > + ksft_set_plan(1); > + kmsg = kmsg_open(); > + if (kmsg < 0) > + ksft_print_msg("cannot read /dev/kmsg: %s, only a crash will " > + "be noticed\n", strerror(errno)); > + > + if (pipe(ready) || pipe(count)) > + ksft_exit_fail_msg("pipe: %s\n", strerror(errno)); > + > + deadline = time(NULL) + secs; > + ksft_print_msg("VE %d, pair %d, %ld seconds\n", ctid, VTTY_IDX, secs); > + > + pid = fork(); Fork could also return error. Please handle it. -- Vasileios Almpanis _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel