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 4F77480160 for ; Mon, 7 Sep 2026 19:16:41 +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 687JFSqB030680; Mon, 7 Sep 2026 22:15:29 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 687JFSqB030680 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="MfU19jwl" 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 687JFJ7e030654 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Mon, 7 Sep 2026 22:15:19 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 687JFJ7e030654 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-48597bbd963so1905530f8f.2 for ; Mon, 07 Sep 2026 12:15:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvBzDsvKY9wkmROH1CgTQNfZb+Ax8/Ir1YLuYnsqKLHE61To+InntwK8/XUd0snLpSONd+MU2sA==@openvz.org X-Gm-Message-State: AFuF++m+Y9GriZSJw4KdiQO98/ciYyU99oBTC6DgV0H6VYYiojIeVHWD nT5PsJzvxQMerI7P0y/D73siMms/FSWtz+a5RsqZSvTZOVV3wxt37daiRarGVTvjuNj2cDZmSEf l4MHCdLIjSs6dndlmtvhMam4FItbuvlxCOzSnaXrtKw47v/PU8JJLKA== X-Gm-Gg: AYBFou0RR/Otlhfttd9g5fGrDTT8LhypfWO/HVx12GO0t31ng7zV6zHUtiAApyjAFyh 3hzaGqltbbca/gkL26jQ5NO1lSolmA2lsHkN9D3dZkYYtJL71V5hwesSddcFSZvRAGvqdc14AFZ bkJp53PdcOhrHRup09Z9mrhH2O9tNStiH7Cto8Iom0IvVRZEoBE0pmu/POb2AbEJoBjFrswSSIQ uasC9KW1xg0lSHTNgzZkGuioyJGoQDze57+m5s5SXvxcp2YhWCSCFLy2uRdzJ0EE0XpVfgHoxgd cBTTMAN/ODGjkHXepDdqx9U90J7T4yq6PqjPfgiWur2eV6dN2sCS4Mv9ZZ2LXq043GDGSciQfT4 9OYUkJitOTWwFS8sZOoZPyxwNfyVy X-Received: by 2002:a05:6000:460b:b0:484:46f9:7adb with SMTP id ffacd0b85a97d-4858709b1e7mr51946595f8f.26.1788808518971; Mon, 07 Sep 2026 12:15:18 -0700 (PDT) X-Received: by 2002:a05:6000:460b:b0:484:46f9:7adb with SMTP id ffacd0b85a97d-4858709b1e7mr51946518f8f.26.1788808518430; Mon, 07 Sep 2026 12:15:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1788808518; cv=none; d=google.com; s=arc-20260327; b=b+zHb7upknySCrVDX5ABQFeWeeZohgxcPB/5prj1W3+LHZIsN0dNiDQYlb4BtnahtA Dak1Q6Xj6zkaLqnE/C5TXb/4u1BkTvz6Pglu/VaJNj54xzIGk/AwFkxbSYTk7HHUt0W1 1VXJ8SOI7QrON7yGINu2EmhCwc97Ex733P0f1fIAMEqTb1iIaGizFLz7rk+BaDSizuMc rHb7vfKrpJHQizW3fBYaAqQ6m+uqlIYDi46wTfAUIZ3dGuoT21VJk76odquVqGxlQmve PBQnnnF2J0zoIYXFdz875j4rLhRTJtmKu03gtjHKqnbrDIJ7n/z6mdf+DMTzOXU4ZQB8 SRow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:dkim-signature; bh=Vv27HpdQYvENFC0YmtHg2SjN7KC0pvOQp4OyW5sE/V8=; fh=4dppuILCfGifWHfxjIIA1BWoKQtGs1EMopxlFiqV6no=; b=X6962RSLovC69d3+vlmDC5eeeG9cXrRwp3g6TQ2MCoVarC750jv2P0lGdyWn1Qco2r vHrn2q2kVaSxOkbZjIOF87ojDf0fBg7l5FRz+pmBCXrjMdHuvsyeaZRQnb/xmGYfOVH1 M84sXB7w8sVmWSqmUei7CwCfv3xtjTONXER6127EcnWt1Hw2K5GtoVBWVAZVnk12Ok4d 7mt4rE8QMWpdwUmMLrCKHIfCvIhQHu6+u6On/zsetIUL07QYvpeMUp5gQQwBCYGrtm7L Ze0eWXL0DnHShvOHtauD01MkBmYmEdQO/ePnXzw0mcUTRZjm9OGWosY+BjKUX6KWgaAC HQjg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=MfU19jwl; spf=pass (google.com: domain of vladimir.riabchun@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=vladimir.riabchun@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-485885bae7dsi22998275f8f.223.2026.09.07.12.15.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 12:15:18 -0700 (PDT) Received-SPF: pass (google.com: domain of vladimir.riabchun@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=MfU19jwl; spf=pass (google.com: domain of vladimir.riabchun@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=vladimir.riabchun@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:Content-Type:MIME-Version:Subject:Date :From; bh=Vv27HpdQYvENFC0YmtHg2SjN7KC0pvOQp4OyW5sE/V8=; b=MfU19jwli2a+PdZQZYk bgKpS20dSRwNxxaFi90uX1KFnlUSJ+C1S8h739DEnPLiQSPZ5rYn96PZqGVwthfLiU/RGnNWufL6O 10nz1XIMFOrvKTwJq8B/zWTN2mDEU6zGGGZoaq3QovUACoJV1aHEbyPBvXX7q/oOYFUDx26wF/nww gdund6ynFOqtPPRvRqKC3YhYvJiD/jWkoiFjExmtM3uGeAGsc6w+hLWdZ0ATnri5/CUG7qs1fUyoK a0EVPXQFHmqSDeL2RGthFaZ5FBEtUIAg/aOpuUvCQZUQd6IB0qfE37D+wp54Sx1HtnpniQjm65hP9 yR0w1/kmbJe2yEw==; Received: from [130.117.225.5] (helo=dev012.aci.vzint.dev) by relay.virtuozzo.com with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1x3elk-006g0W-2k; Mon, 07 Sep 2026 21:15:09 +0200 From: Vladimir Riabchun Date: Mon, 07 Sep 2026 19:14:44 +0000 MIME-Version: 1.0 Message-Id: <20260907-ve-selftest-improv-v1-1-a17847abbd48@virtuozzo.com> References: <20260907-ve-selftest-improv-v1-0-a17847abbd48@virtuozzo.com> In-Reply-To: <20260907-ve-selftest-improv-v1-0-a17847abbd48@virtuozzo.com> To: Konstantin Khorenko X-Mailer: b4 0.16.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH VZ10 1/3] selftests/ve: Add namespace management helpers 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 When mount namespace is created in a child, it is destroyed when the child dies. We may need to keep it for a while to check how VE handles resources. Instead of keeping a thread which lives in a new ve+mnt namespaces, let's store open namespace file descriptors to enter them later without keeping children alive. https://virtuozzo.atlassian.net/browse/VSTOR-144504 Feature: ve selftests Signed-off-by: Vladimir Riabchun --- tools/testing/selftests/ve/ve_selftest.h | 118 +++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/tools/testing/selftests/ve/ve_selftest.h b/tools/testing/selftests/ve/ve_selftest.h index c53bf7900d20..b3c5bf63f34d 100644 --- a/tools/testing/selftests/ve/ve_selftest.h +++ b/tools/testing/selftests/ve/ve_selftest.h @@ -31,6 +31,124 @@ #define VE_CONTROLLERS \ "+cpuset +cpu +cpuacct +io +memory +hugetlb +pids +rdma +misc +ve" +struct namespace_ctx { + int ns_save_mask; /* Mask of stored CLONE_NEW* namespaces. */ + /* Namespace file descriptors. Name should match /proc/PID/ns/NAME */ + int ve_fd; + int mnt_fd; +}; + +static inline void close_namespace_fds(struct namespace_ctx *ctx) +{ + if (ctx->ns_save_mask & CLONE_NEWVE) + close(ctx->ve_fd); + if (ctx->ns_save_mask & CLONE_NEWNS) + close(ctx->mnt_fd); + + ctx->ns_save_mask = 0; +} + +static inline int save_namespace_fds(struct namespace_ctx *ctx, int flags) +{ +#define OPEN_NS(name, flag) \ +do { \ + if (flags & flag) { \ + ctx->name##_fd = open("/proc/self/ns/" #name, O_RDONLY); \ + if (ctx->name##_fd < 0) { \ + fprintf(stderr, "%s: could not open fd %s: %s\n", \ + __func__, #name, strerror(errno)); \ + goto err; \ + } \ + ctx->ns_save_mask |= flag; \ + } \ +} while (0) + + ctx->ns_save_mask = 0; + + OPEN_NS(ve, CLONE_NEWVE); + OPEN_NS(mnt, CLONE_NEWNS); + + return 0; + +err: + close_namespace_fds(ctx); + return -1; +} + +static inline int enter_namespaces(struct namespace_ctx *ctx, int flags) +{ +#define JOIN_NS(name, flag) \ +do { \ + if (flags & flag) { \ + if (!(ctx->ns_save_mask & flag)) { \ + fprintf(stderr, "%s: could not switch ns %s:" \ + " no fd in context.\n", __func__, #name); \ + return -1; \ + } \ + if (setns(ctx->name##_fd, flag)) { \ + fprintf(stderr, "%s: could not switch ns %s: %s\n", \ + __func__, #name, strerror(errno)); \ + return -1; \ + } \ + } \ +} while (0) + + JOIN_NS(mnt, CLONE_NEWNS); + JOIN_NS(ve, CLONE_NEWVE); + return 0; +} + +static inline int enter_cgroup(int cgv2_fd, int ctid); + +/* + * Create new namespaces and store them in ctx. + * CLONE_NEWVE is treated specially - before unshare corresponding + * CT cgroup is entered, after it root cgroup is entered(not original one). + */ +static inline int prepare_namespaces(struct namespace_ctx *ctx, int flags, + int cgv2_fd, int ctid) +{ + struct namespace_ctx tmp_ctx; + + if (save_namespace_fds(&tmp_ctx, flags) < 0) + return -1; + + if (flags & CLONE_NEWVE) { + if (enter_cgroup(cgv2_fd, ctid) < 0) { + fprintf(stderr, "%s: failed to enter CT cgroup\n", __func__); + return -1; + } + } + + if (unshare(flags) < 0) { + fprintf(stderr, "%s: failed to unshare, flags %x: %s\n", + __func__, flags, strerror(errno)); + return -1; + } + + if (save_namespace_fds(ctx, flags)) { + fprintf(stderr, "%s: failed to save new namespaces, flags %x\n", + __func__, flags); + return -1; + } + + if (flags & CLONE_NEWVE) { + if (enter_cgroup(cgv2_fd, 0) < 0) { + fprintf(stderr, "%s: failed to restore root cgroup\n", __func__); + return -1; + } + } + + if (enter_namespaces(&tmp_ctx, flags) < 0) { + fprintf(stderr, "%s: failed to restore old namespaces, flags %x\n", + __func__, flags); + return -1; + } + + close_namespace_fds(&tmp_ctx); + return 0; +} + static inline int write_file_at(int dirfd, const char *path, const char *val) { int fd, ret; -- 2.47.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel