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 2F64180632 for ; Fri, 25 Sep 2026 12:48:31 +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 68PClBKf025240; Fri, 25 Sep 2026 15:47:12 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68PClBKf025240 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="igDpw9Q+" Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 68PClAqf025224 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Fri, 25 Sep 2026 15:47:10 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68PClAqf025224 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-49e661c6440so5261735e9.3 for ; Fri, 25 Sep 2026 05:47:10 -0700 (PDT) X-Gm-Message-State: AFuF++kB/e2OE5TcA3mut4dTrGml2OdTxO3hWyTsBK4HplpDwdQohhTB 5Fs3D7jdT5qPRpnKwcym+1E9BHqx3mnn3LyUlZTJsQ1b/W9uhmzCHdzy+gM+wEUtdtSMOGttiGT CVZXHWO50ytUZ5AEsryauNdyfzsakuQ+/h481Num8q22RW+8T3KpowQ== X-Gm-Gg: AYBFou1zqkCMIrPjmF3iFz90UtikHRnfmU2twkv5x53fbCPeDcTRWtUpIhkzskSYAoT 4YN+BJSbarwl+Fsn4IP6BGNAtzBoCe6vdVWk4DuJxXUOSYf5y56jIrEkFwV/bnmWI5pGcvTdLvG 4NaaIv4oTxVm0VSBHhZrc6MiPmw6Zgd8WdAyh2Q9tVsAJewj43Hg2TFhCo2j6QdW95FQ8kJliQj AdQjIsuC87AT5J4EqQK+A6F2Ml+LREwbjTOSzbdi+LggOPMzXmbP8iq28qnN2dW4q/H6TDvRwYc ItSxBpMEoamt99T389+oFhdevnYJ4EW2eZYiQvuO64cP9EkQZbHWwSrK2quqwDO+omh1TLz0+Dp RxqIXmMNehJmP5xMv X-Received: by 2002:a05:600c:620e:b0:49f:f233:4439 with SMTP id 5b1f17b1804b1-49ff2334791mr33592715e9.30.1790340429815; Fri, 25 Sep 2026 05:47:09 -0700 (PDT) X-Received: by 2002:a05:600c:620e:b0:49f:f233:4439 with SMTP id 5b1f17b1804b1-49ff2334791mr33592355e9.30.1790340429333; Fri, 25 Sep 2026 05:47:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1790340429; cv=none; d=google.com; s=arc-20260327; b=lsko0chBaeFy7NiUACPvrzaxIefCs2QdKkAc4fSAWdheUP92Em2S0b3IEQCWuhZEIv 3nWlYm1RCvHH/DbjhMFJdq0c3x1adSUqyIKDC78VaaFOVETh4m7MPuAehGWk2cGP2xvS iRTgKGqj9Mi0XordIRTpaTxzK/UZGAUEUDeanVxnODQsWF1P28vtNytts3JoZ8R+NL3N uK44B5AuXL6wpXIv8volrMM0TYZUrXWDA0qC3Fz4jvZbw51ARJ04f6qkXJr+5RhZCqAL aPp1EWV53K6TT/oaARY/0EJuMWBS1uDAlANZgyFXuVp25x1i2WGv7GDZXEq9iZxqMXoW P7Qg== 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=//D4MXJ6+Bap2ATG5I/MfQ87+Dzgf7UAEklAOqozV+4=; fh=RKXkvghX4iWYZXS5wDgL7Ui0VKwsIa3ttyVns5QVLNU=; b=C3vWiSnZ3AejWkcT2Ttonvc5+6M2nn9HzL4w+gAFqlpXA3M6HWiX4psrCUpk/Nikrd 6NoOJE9GJMVx1MgyLJlnsSOj5BdvXUU0dd5e3dj/JO+o53/kaZGOGsK7EFRj57grXHWV 5fdOpBjNvo1Gahsk0I6g0TpTwd7BQOkn7THn8lNn546rj+sD1XqLbpzXQMn01PDmUSqe c/eMRpzSQJNwRHJPx+4wQ+AQKfD/Ikploy8YrYbk2MgRMY98hUAQKatOj1EBiDJWaltW X7y6c8juMYcpY/sT0Gkqre3rL4naew4FjUfCbqiH8jOdivxlT02JAZJDsZN6ikF5NBNf wZiQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=igDpw9Q+; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@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-4887a84d6cbsi5351972f8f.229.2026.09.25.05.47.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Sep 2026 05:47:09 -0700 (PDT) Received-SPF: pass (google.com: domain of khorenko@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=igDpw9Q+; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@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=//D4MXJ6+Bap2ATG5I/MfQ87+Dzgf7UAEklAOqozV+4=; b=igDpw9Q+gfHyYIwBLic Xcle0WyFz0n75z2ZiSGZ/wNVQPTNmP5xe2AIEkMUsappm3Gxd0/WV3weL219/h52Ws43fiXOi/u2s VyzHv/HJt7/RNHiRhyn7U8kIS5jrjLzcwRU3a0w0iGQvqBwhmOtgwoPddw1YWdU8PDoOoM26J+gLf Zi3tFqCXsriD9WzPqg/L4w5qjnnQUA5V/7XiGq9fdVG4Q2JoBCjD0hIAz7bnBbySyaTYYKcc4PdSI O8t0uv1kzCXEYCOUBA3mURjxduA9HWr1w7glCI29udtTc8jHpHq0L3JUgLXv2SzSUoYcrr6jyfQaq OuyxoYvYvWghlgg==; Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=f0.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1xA5HZ-007Y8o-02; Fri, 25 Sep 2026 14:47:05 +0200 From: Konstantin Khorenko Date: Fri, 25 Sep 2026 14:47:03 +0200 MIME-Version: 1.0 Message-Id: <20260925-ve-selftest-improv-v4-2-1f505bd0eca6@virtuozzo.com> References: <20260925-ve-selftest-improv-v4-0-1f505bd0eca6@virtuozzo.com> In-Reply-To: <20260925-ve-selftest-improv-v4-0-1f505bd0eca6@virtuozzo.com> To: Vladimir Riabchun , Vasileios Almpanis X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5254; i=khorenko@virtuozzo.com; h=from:subject:message-id; bh=Z1jX07Ef8XrtJmsOwWJXH0FcVOWrWCFnoIOxjfJJMMY=; b=owEBbQKS/ZANAwAKAVGWCkf5YVwqAcsmYgBqtm1LpiwCP8FJ8Cvonvx11TfFeQuQivYe/3wZs ORGmK3N5R6JAjMEAAEKAB0WIQRWD23IPcXT0GO9CCxRlgpH+WFcKgUCarZtSwAKCRBRlgpH+WFc Kq4eEACZiKA75gXHyPben7Sw/fhbxHcVQRuEm1xSnYq3VWwLVRBmmFHZrxWXJtZJR1F8MozwK52 PttLsdCT0TwrVs6G+W99lqSn3C1w9VInsLZlVSZ0mMRHv/YG45zOoExBy+FR+OpKSQdE4sytfRf adlM1X36cGyJdx84/fkXWmrA7wnP3l437JPVN4JcFPmNCZL+kvDZo0MmcGgcI7vh3O42sJcyJgn a6CsYomc8WUvItNDoU8T+5R5i23zKUOQY8yAYmry7aFVFBlGgNuxhY02NEPovSvoL3D4Ig+G6b7 X5P1jv76WbZr5soYHUcn+d74oH4DH909/krRDqg8iGaUjID5GZe3oryvYtJhXJ08U6O2/OHvJpF IzUkiD5qlkktdSofQ6CDrOwxz5Uwu/Dk+Y0Ek3cR3JNMpTM9nDQ/+I8JS71JXaYD+i9sk8f7ILD NpGAmluvc76SlhqiU4gIL8Z1uk+e9UqFRROJfAaXgilgjo1e0R+GMchduX5j3oWc3UQmB5ovTf2 +a6ycZxXIdmSN9dfw50/4BHkIU1Ktk2v4XmKMS6XgUJBO6rgeV0ZoyxeCuGXW0cWr+n2y5aO+CH 9uTo5a4S8czXOu8JhGaFMwRtVan5I4OVUWoptuYUuCq8MAAcvWvHlSNERVWZTyEAzU0WobQ1FPw uLaXbV8yBBssq8Q== X-Developer-Key: i=khorenko@virtuozzo.com; a=openpgp; fpr=560F6DC83DC5D3D063BD082C51960A47F9615C2A X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH VZ10 v4 2/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 From: Vladimir Riabchun 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 Reviewed-by: Vasileios Almpanis Reviewed-by: Konstantin Khorenko --- tools/testing/selftests/ve/ve_selftest.h | 130 +++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/tools/testing/selftests/ve/ve_selftest.h b/tools/testing/selftests/ve/ve_selftest.h index c53bf7900d208..bc9dc28a8d074 100644 --- a/tools/testing/selftests/ve/ve_selftest.h +++ b/tools/testing/selftests/ve/ve_selftest.h @@ -31,6 +31,136 @@ #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); + +#undef OPEN_NS + 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(ve, CLONE_NEWVE); + JOIN_NS(mnt, CLONE_NEWNS); + +#undef JOIN_NS + 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 the original one). + */ +static inline int prepare_namespaces(struct namespace_ctx *ctx, int flags, + int cgv2_fd, int ctid) +{ + struct namespace_ctx tmp_ctx; + int ret = 0; + + ctx->ns_save_mask = 0; + + 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__); + ret = -1; + goto restore_ns; + } + } + + if (unshare(flags) < 0) { + fprintf(stderr, "%s: failed to unshare, flags %x: %s\n", + __func__, flags, strerror(errno)); + ret = -1; + goto restore_cg; + } + + if (save_namespace_fds(ctx, flags)) { + fprintf(stderr, "%s: failed to save new namespaces, flags %x\n", + __func__, flags); + ret = -1; + } + +restore_cg: + if (flags & CLONE_NEWVE) { + if (enter_cgroup(cgv2_fd, 0) < 0) { + fprintf(stderr, "%s: failed to restore root cgroup\n", __func__); + ret = -1; + } + } + +restore_ns: + if (enter_namespaces(&tmp_ctx, flags) < 0) { + fprintf(stderr, "%s: failed to restore old namespaces, flags %x\n", + __func__, flags); + ret = -1; + } + + close_namespace_fds(&tmp_ctx); + if (ret < 0) + close_namespace_fds(ctx); + return ret; +} + static inline int write_file_at(int dirfd, const char *path, const char *val) { int fd, ret; -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel