From nobody Wed Jun 10 17:27:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777027383; cv=none; d=zohomail.com; s=zohoarc; b=mucxDWgLVN8qxS83rE4VQCi3AkP9KPWcMIl67BpFFvVce97FX4sa9h5G4wNjrOVOM9SMtwGFpP0k2D25GAPoifSwCZAm8jHqOijeLUmXkBqxKKTB4tbJmL+eDg1qZbW0rauCll6Hw+oaGE0gEOMY2cEoFQNTG3XnFtD7b5JHI7o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777027383; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=cilbDZoU5PUv7qJ1rQV6PvbM1ca8icYDWbLNUR/aQDE=; b=e0hbGKbvzJ09CYB3PsPQmKTX8k5HpZHydhuNJetC7hJTpcJtDpIxSRuVknOn7D/pPPhg5P3iXMuZnHda2RqI9+TElbFRhoZMX+wg+Yz1NyIU4HcycjnCT7uuR0B9w2ow3BayZ8PbY96gV+D1a+E3qmXRrtwoVFS+r8fLYWlMWwA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777027383875682.736961742866; Fri, 24 Apr 2026 03:43:03 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A003341943; Fri, 24 Apr 2026 06:43:02 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 7F50441CA4; Fri, 24 Apr 2026 06:37:28 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D9F183F83B; Fri, 24 Apr 2026 06:36:56 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id D91D14193B for ; Fri, 24 Apr 2026 06:36:52 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-138-wgKxmICWPzqpRMdg4C_R1g-1; Fri, 24 Apr 2026 06:36:50 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 23D1E19560B8 for ; Fri, 24 Apr 2026 10:36:50 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 805593007572 for ; Fri, 24 Apr 2026 10:36:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777027012; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cilbDZoU5PUv7qJ1rQV6PvbM1ca8icYDWbLNUR/aQDE=; b=QygUkNR+8EvUI1W95njaWyy9ldSEzpANiJiyQJkJIgFrifHsZ3d81zRwQvonLhwqmj6Ar7 iENv8Ie9hTLv5mQMiWlz15YZT0QJO3fG49cct5Bf7o7FgK2B4s7uJGdw2lo2x3Xn++wvTn fb5uYE3crBC0YsOSYND1aSZjFY6NiuY= X-MC-Unique: wgKxmICWPzqpRMdg4C_R1g-1 X-Mimecast-MFC-AGG-ID: wgKxmICWPzqpRMdg4C_R1g_1777027010 To: devel@lists.libvirt.org Subject: [PATCH 1/4] src: Introduce virCgroupFreezerState enum Date: Fri, 24 Apr 2026 12:36:42 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Ppi1xcaWBD2bQ-L_mJHM06SQK0k7RSj2itmdK1CL6ho_1777027010 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: G5URLWO3XEV63GVWV6VJ6U7S55SA5V6M X-Message-ID-Hash: G5URLWO3XEV63GVWV6VJ6U7S55SA5V6M X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777027385575158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik So far, only vircgroupv1 implements freezer controller related callbacks and both work with strings ("THAWED", "FROZEN", "FREEZING"). This works well with v1 but with CGroupsV2 there are just two states and they are represented by a number. Therefore, introduce an enum and implement enum <-> string conversion for each backend separately. Signed-off-by: Michal Privoznik Reviewed-by: Pavel Hrdina --- src/lxc/lxc_driver.c | 15 +++++++++------ src/lxc/lxc_process.c | 3 ++- src/util/vircgroup.c | 10 ++++++---- src/util/vircgroup.h | 12 ++++++++++-- src/util/vircgroupbackend.h | 4 ++-- src/util/vircgroupv1.c | 38 +++++++++++++++++++++++++++++++------ 6 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index c0a93c0444..3ec6d298bd 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2495,11 +2495,12 @@ static int lxcFreezeContainer(virDomainObj *vm) int check_interval =3D 1; /* In milliseconds */ int exp =3D 10; int waited_time =3D 0; - g_autofree char *state =3D NULL; virLXCDomainObjPrivate *priv =3D vm->privateData; =20 while (waited_time < timeout) { + virCgroupFreezerState state; int r; + /* * Writing "FROZEN" to the "freezer.state" freezes the group, * i.e., the container, temporarily transiting "FREEZING" state. @@ -2507,7 +2508,8 @@ static int lxcFreezeContainer(virDomainObj *vm) * to "FROZEN". * (see linux-2.6/Documentation/cgroups/freezer-subsystem.txt) */ - r =3D virCgroupSetFreezerState(priv->cgroup, "FROZEN"); + r =3D virCgroupSetFreezerState(priv->cgroup, + VIR_CGROUP_FREEZER_STATE_FROZEN); =20 /* * Returning EBUSY explicitly indicates that the group is @@ -2540,9 +2542,9 @@ static int lxcFreezeContainer(virDomainObj *vm) VIR_DEBUG("Reading freezer.state failed with errno: %d", r); goto error; } - VIR_DEBUG("Read freezer.state: %s", state); + VIR_DEBUG("Read freezer.state: %d", state); =20 - if (STREQ(state, "FROZEN")) + if (state =3D=3D VIR_CGROUP_FREEZER_STATE_FROZEN) return 0; =20 waited_time +=3D check_interval; @@ -2563,7 +2565,7 @@ static int lxcFreezeContainer(virDomainObj *vm) * activate the group again and return an error. * This is likely to fall the group back again gracefully. */ - virCgroupSetFreezerState(priv->cgroup, "THAWED"); + virCgroupSetFreezerState(priv->cgroup, VIR_CGROUP_FREEZER_STATE_THAWED= ); return -1; } =20 @@ -2643,7 +2645,8 @@ static int lxcDomainResume(virDomainPtr dom) "%s", _("domain is already running")); goto endjob; } else if (state =3D=3D VIR_DOMAIN_PAUSED) { - if (virCgroupSetFreezerState(priv->cgroup, "THAWED") < 0) { + if (virCgroupSetFreezerState(priv->cgroup, + VIR_CGROUP_FREEZER_STATE_THAWED) < 0)= { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Resume operation failed")); goto endjob; diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index c731b28871..e22f77ef83 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -860,7 +860,8 @@ int virLXCProcessStop(virLXCDriver *driver, return -1; } =20 - if (virCgroupSetFreezerState(priv->cgroup, "THAWED") < 0) { + if (virCgroupSetFreezerState(priv->cgroup, + VIR_CGROUP_FREEZER_STATE_THAWED) < 0)= { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Unable to thaw all processes")); =20 diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 3d66d3acb2..e7c93cd010 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -2902,7 +2902,8 @@ virCgroupGetCpuacctStat(virCgroup *group, unsigned lo= ng long *user, =20 =20 int -virCgroupSetFreezerState(virCgroup *group, const char *state) +virCgroupSetFreezerState(virCgroup *group, + virCgroupFreezerState state) { virCgroup *parent =3D virCgroupGetNested(group); =20 @@ -2912,7 +2913,8 @@ virCgroupSetFreezerState(virCgroup *group, const char= *state) =20 =20 int -virCgroupGetFreezerState(virCgroup *group, char **state) +virCgroupGetFreezerState(virCgroup *group, + virCgroupFreezerState *state) { virCgroup *parent =3D virCgroupGetNested(group); =20 @@ -3725,7 +3727,7 @@ virCgroupGetDomainTotalCpuStats(virCgroup *group G_GN= UC_UNUSED, =20 int virCgroupSetFreezerState(virCgroup *group G_GNUC_UNUSED, - const char *state G_GNUC_UNUSED) + virCgroupFreezerState state G_GNUC_UNUSED) { virReportSystemError(ENOSYS, "%s", _("Control groups not supported on this platform"= )); @@ -3735,7 +3737,7 @@ virCgroupSetFreezerState(virCgroup *group G_GNUC_UNUS= ED, =20 int virCgroupGetFreezerState(virCgroup *group G_GNUC_UNUSED, - char **state G_GNUC_UNUSED) + virCgroupFreezerState **state G_GNUC_UNUSED) { virReportSystemError(ENOSYS, "%s", _("Control groups not supported on this platform"= )); diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 2a7aa3306c..6d0aa11e90 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -254,8 +254,16 @@ int virCgroupGetCpuacctPercpuUsage(virCgroup *group, c= har **usage); int virCgroupGetCpuacctStat(virCgroup *group, unsigned long long *user, unsigned long long *sys); =20 -int virCgroupSetFreezerState(virCgroup *group, const char *state); -int virCgroupGetFreezerState(virCgroup *group, char **state); +typedef enum { + VIR_CGROUP_FREEZER_STATE_THAWED, + VIR_CGROUP_FREEZER_STATE_FROZEN, + VIR_CGROUP_FREEZER_STATE_FREEZING, + + VIR_CGROUP_FREEZER_STATE_LAST +} virCgroupFreezerState; + +int virCgroupSetFreezerState(virCgroup *group, virCgroupFreezerState state= ); +int virCgroupGetFreezerState(virCgroup *group, virCgroupFreezerState *stat= e); =20 int virCgroupSetCpusetMems(virCgroup *group, const char *mems); int virCgroupGetCpusetMems(virCgroup *group, char **mems); diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h index ee2f6c1ec7..6effe49df6 100644 --- a/src/util/vircgroupbackend.h +++ b/src/util/vircgroupbackend.h @@ -339,11 +339,11 @@ typedef int =20 typedef int (*virCgroupSetFreezerStateCB)(virCgroup *group, - const char *state); + virCgroupFreezerState state); =20 typedef int (*virCgroupGetFreezerStateCB)(virCgroup *group, - char **state); + virCgroupFreezerState *state); =20 typedef int (*virCgroupSetCpusetMemsCB)(virCgroup *group, diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index c1f0562249..ac05531f7d 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -2049,23 +2049,49 @@ virCgroupV1GetCpuacctStat(virCgroup *group, } =20 =20 +VIR_ENUM_DECL(virCgroupFreezerState); +VIR_ENUM_IMPL(virCgroupFreezerState, + VIR_CGROUP_FREEZER_STATE_LAST, + "THAWED", + "FROZEN", + "FREEZING" +); + static int virCgroupV1SetFreezerState(virCgroup *group, - const char *state) + virCgroupFreezerState state) { + const char *stateStr =3D virCgroupFreezerStateTypeToString(state); + return virCgroupSetValueStr(group, VIR_CGROUP_CONTROLLER_FREEZER, - "freezer.state", state); + "freezer.state", stateStr); } =20 =20 static int virCgroupV1GetFreezerState(virCgroup *group, - char **state) + virCgroupFreezerState *state) { - return virCgroupGetValueStr(group, - VIR_CGROUP_CONTROLLER_FREEZER, - "freezer.state", state); + g_autofree char *stateStr =3D NULL; + int s; + + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_FREEZER, + "freezer.state", &stateStr) < 0) { + return -1; + } + + s =3D virCgroupFreezerStateTypeFromString(stateStr); + if (s < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown value of freezer controller: %1$s"), + stateStr); + return -1; + } + + *state =3D s; + return 0; } =20 =20 --=20 2.53.0 From nobody Wed Jun 10 17:27:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777027171; cv=none; d=zohomail.com; s=zohoarc; b=iaggejDgB07pkY1AJ6kbTN8UZh1JToJC5VQ/DdwA+8zdox3ItyKh7RysGC5sFRMOcEUUK/Zs/1qMybPer0lL+tntXeJ72baDH41nyA5nPNLwBQ0+RjGEK0RD+llDYNw6G14vRLN8YgO0zTNJyAWQ3y/QO1tYmG/XS2oIwY9dNI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777027171; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=zf/FG20nKSJguy0MU9U2XldGqKNaZJcHQTQTYGS8Ygo=; b=Rb7E9S/yHv6fqGtG5zvRrOXMtWyWRXQgNzZO+rBZkRdnB3SyKMru5BzoxbBWLz5oOTJrbE8BpKNTiAZP8HnaqlKa+Rr8h0GgLzB0ZBmJl5JS4z6NntSi8v5DmSB/8bKMO3LFvHFx6PGvpxrB47Uc8tjRsdWF03y9YjrDA3bQ0xU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 17770271717681012.7574190938689; Fri, 24 Apr 2026 03:39:31 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A05CC41975; Fri, 24 Apr 2026 06:39:30 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 95F4B41AAA; Fri, 24 Apr 2026 06:37:15 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 98EBD41939; Fri, 24 Apr 2026 06:36:56 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id D41D34198B for ; Fri, 24 Apr 2026 06:36:53 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-244-Glhb0fg-O_iQS1HP16ldpw-1; Fri, 24 Apr 2026 06:36:51 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 309751956052 for ; Fri, 24 Apr 2026 10:36:51 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8D99A300757B for ; Fri, 24 Apr 2026 10:36:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777027013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zf/FG20nKSJguy0MU9U2XldGqKNaZJcHQTQTYGS8Ygo=; b=Tdzlk7vd9mqG3OqC8U7VssGyYnzFHS/FzEmmvdcDvNpTNN65Z9VxmsLJaxrVTGaSeuxQXY rnuhp9x0mlFbbGZ3qPbc+kuJJW0voiupoGmgQtclcLbg1jIxbcvutwtky65GCrbM0zs8VQ 47yljj21h9hUKxCcDlNDGmwUCQYNCXo= X-MC-Unique: Glhb0fg-O_iQS1HP16ldpw-1 X-Mimecast-MFC-AGG-ID: Glhb0fg-O_iQS1HP16ldpw_1777027011 To: devel@lists.libvirt.org Subject: [PATCH 2/4] vircgroupv2: Freezer controller is implicit Date: Fri, 24 Apr 2026 12:36:43 +0200 Message-ID: <9ea9ea16900d6dc4ea89fd40117a4ee63b0c9f27.1777026960.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: J36IR5sOzDaYhOfRTD8EKiUXhtUYzsGoCLoYdOO35yI_1777027011 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: FZQI2GLPD73AYMDFM3OTYSK7RXSR33LC X-Message-ID-Hash: FZQI2GLPD73AYMDFM3OTYSK7RXSR33LC X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777027172477158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik The freezer controller in CGroupsV2 is always present (under cgroup.freeze file). Make our vircgroupv2 backend aware of it. NB, because of the way our backends are ordered (v2 is prefered) the v1 freezer is never going to be used when CGroupsV2 are detected. Hence the change to tests. NB2, this also fixes output of virt-host-validate which complains that the 'freezer' controller is not present for LXC driver. Signed-off-by: Michal Privoznik Reviewed-by: Pavel Hrdina --- src/util/vircgroupv2.c | 5 +++++ tests/vircgroupdata/hybrid.parsed | 2 +- tests/vircgrouptest.c | 5 +++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index eaf5ae98f6..3fbd67fbda 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -319,6 +319,10 @@ virCgroupV2DetectControllers(virCgroup *group, * exists with usage stats. */ group->unified.controllers |=3D 1 << VIR_CGROUP_CONTROLLER_CPUACCT; =20 + /* Similarly, the freezer controller is always available via cgroup.fr= eeze + * file. */ + group->unified.controllers |=3D 1 << VIR_CGROUP_CONTROLLER_FREEZER; + if (virCgroupV2DevicesAvailable(group)) group->unified.controllers |=3D 1 << VIR_CGROUP_CONTROLLER_DEVICES; =20 @@ -480,6 +484,7 @@ virCgroupV2MakeGroup(virCgroup *parent, =20 /* Controllers that are implicitly enabled if available. */ if (i =3D=3D VIR_CGROUP_CONTROLLER_CPUACCT || + i =3D=3D VIR_CGROUP_CONTROLLER_FREEZER || i =3D=3D VIR_CGROUP_CONTROLLER_DEVICES) { continue; } diff --git a/tests/vircgroupdata/hybrid.parsed b/tests/vircgroupdata/hybrid= .parsed index f755eed465..e92abacc7a 100644 --- a/tests/vircgroupdata/hybrid.parsed +++ b/tests/vircgroupdata/hybrid.parsed @@ -3,7 +3,7 @@ cpuacct cpuset /not/really/sys/fs/cgroup/cpuset memory devices -freezer /not/really/sys/fs/cgroup/freezer +freezer blkio net_cls /not/really/sys/fs/cgroup/net_cls perf_event /not/really/sys/fs/cgroup/perf_event diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c index 0e7645af7a..eb85b6d012 100644 --- a/tests/vircgrouptest.c +++ b/tests/vircgrouptest.c @@ -529,6 +529,7 @@ static int testCgroupNewForSelfUnified(const void *args= G_GNUC_UNUSED) (1 << VIR_CGROUP_CONTROLLER_CPUACCT) | (1 << VIR_CGROUP_CONTROLLER_MEMORY) | (1 << VIR_CGROUP_CONTROLLER_DEVICES) | + (1 << VIR_CGROUP_CONTROLLER_FREEZER) | (1 << VIR_CGROUP_CONTROLLER_BLKIO); =20 if (virCgroupNewSelf(&cgroup) < 0) { @@ -547,13 +548,11 @@ static int testCgroupNewForSelfHybrid(const void *arg= s G_GNUC_UNUSED) const char *empty[VIR_CGROUP_CONTROLLER_LAST] =3D { 0 }; const char *mounts[VIR_CGROUP_CONTROLLER_LAST] =3D { [VIR_CGROUP_CONTROLLER_CPUSET] =3D "/not/really/sys/fs/cgroup/cpus= et", - [VIR_CGROUP_CONTROLLER_FREEZER] =3D "/not/really/sys/fs/cgroup/fre= ezer", [VIR_CGROUP_CONTROLLER_NET_CLS] =3D "/not/really/sys/fs/cgroup/net= _cls", [VIR_CGROUP_CONTROLLER_PERF_EVENT] =3D "/not/really/sys/fs/cgroup/= perf_event", }; const char *placement[VIR_CGROUP_CONTROLLER_LAST] =3D { [VIR_CGROUP_CONTROLLER_CPUSET] =3D "/", - [VIR_CGROUP_CONTROLLER_FREEZER] =3D "/", [VIR_CGROUP_CONTROLLER_NET_CLS] =3D "/", [VIR_CGROUP_CONTROLLER_PERF_EVENT] =3D "/", }; @@ -562,6 +561,7 @@ static int testCgroupNewForSelfHybrid(const void *args = G_GNUC_UNUSED) (1 << VIR_CGROUP_CONTROLLER_CPUACCT) | (1 << VIR_CGROUP_CONTROLLER_MEMORY) | (1 << VIR_CGROUP_CONTROLLER_DEVICES) | + (1 << VIR_CGROUP_CONTROLLER_FREEZER) | (1 << VIR_CGROUP_CONTROLLER_BLKIO); =20 if (virCgroupNewSelf(&cgroup) < 0) { @@ -619,6 +619,7 @@ static int testCgroupNewForSelfSystemdUnified(const voi= d *args G_GNUC_UNUSED) (1 << VIR_CGROUP_CONTROLLER_CPUACCT) | (1 << VIR_CGROUP_CONTROLLER_MEMORY) | (1 << VIR_CGROUP_CONTROLLER_DEVICES) | + (1 << VIR_CGROUP_CONTROLLER_FREEZER) | (1 << VIR_CGROUP_CONTROLLER_BLKIO); =20 if (virCgroupNewSelf(&cgroup) < 0) { --=20 2.53.0 From nobody Wed Jun 10 17:27:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777027247; cv=none; d=zohomail.com; s=zohoarc; b=hRZQQznehfp1VC4kRGw81sWhcII1X+CnULBuLUhGMsh2ueJ3q1MxwWM3YzrSWOcvwcial8Qn8aDvVrXQzyED4g/rBIPIc5rPQrFqWBx8EoNhhFrW/rmqFz4zqr37VC0KGl9t/2zCZjPUdISehLd6rZRAhYJ23k7OSqkNBK7YyQQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777027247; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=PAbutKmGsHSLdRec6EvOmJ+fgifrqU4RmWjZTLqbRXM=; b=gx1a2WEr4ktrttqjI4fY1nMy01KediBO+3ryQiamrSEbe5I9aaM8UplyAmoMYKwdPj/qNyHIPoQ+xXPaIXNMTzL0UaTqwqSkNeDqLzbt6kfykiwIO9ACyqrgYECr4GV4/Lf1SX8q/6MNhTQv9ak5/ur6X7oAGQ/ZpaXfPpiOiqU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777027247805809.43008597004; Fri, 24 Apr 2026 03:40:47 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 88691419C7; Fri, 24 Apr 2026 06:40:46 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 1498441BB5; Fri, 24 Apr 2026 06:37:20 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A54683F83B; Fri, 24 Apr 2026 06:36:56 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 17AAF3F83B for ; Fri, 24 Apr 2026 06:36:54 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-325-Dwq0IJPLOBC7vGPGuqbw9w-1; Fri, 24 Apr 2026 06:36:53 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2D202195605C for ; Fri, 24 Apr 2026 10:36:52 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8B0163007572 for ; Fri, 24 Apr 2026 10:36:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777027014; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PAbutKmGsHSLdRec6EvOmJ+fgifrqU4RmWjZTLqbRXM=; b=IgBO+utg5tl+1d6Ds/f1WwLUVhHhqZoOcJnQ2ASFbJCM2a2G38l5DBy75++02Hr5QT0FY8 gVbPulyvF3v4lEKJDKT4Jgbs2i1aLU/wNwA+aG+xgH6CTeWB2UWKcOl2fZgL5Az1AQt35F TxKVZLeiqC+VKGEplM+LtfCWuk/5dE4= X-MC-Unique: Dwq0IJPLOBC7vGPGuqbw9w-1 X-Mimecast-MFC-AGG-ID: Dwq0IJPLOBC7vGPGuqbw9w_1777027012 To: devel@lists.libvirt.org Subject: [PATCH 3/4] vircgroupv2: Implement freezer controller Date: Fri, 24 Apr 2026 12:36:44 +0200 Message-ID: <76c18f5ee78dafdc57c21a0c7d937566d0a9d692.1777026960.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Kp_UB4JwIE6YAeLTzPgY3o0GB3GbqiPf5wMy24GTHVk_1777027012 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZDWHN2JG5YG5AR5LWDOZVAGQGILD3IWQ X-Message-ID-Hash: ZDWHN2JG5YG5AR5LWDOZVAGQGILD3IWQ X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777027248842158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik With CGroupsV2 the freezer controller is split into two files: 1) cgroup.freeze where an integer is written to thaw(0)/freeze(1) processes within the cgroup, and 2) cgroup.events where the frozen status can be read. Now, freezing/thawing a cgroup is as simple as writing corresponding integer into cgroup.freeze. But similarly to CGroupsV1, it may take some time to actually freeze all processes inside the cgroup. So read both file and map combination of their values according to this table: | frozen from cgroup.events cgroup.freeze | 0 | 1 Reviewed-by: Pavel Hrdina --------------+------------+------------- 0 | THAWED | N/A --+------------+------------- 1 | FREEZING | FROZEN Resolves: https://gitlab.com/libvirt/libvirt/-/work_items/870 Signed-off-by: Michal Privoznik --- src/util/vircgroupv2.c | 87 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index 3fbd67fbda..1f2ba72c4d 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -1907,6 +1907,90 @@ virCgroupV2DenyAllDevices(virCgroup *group) } =20 =20 +static int +virCgroupV2SetFreezerState(virCgroup *group, + virCgroupFreezerState state) +{ + unsigned long long val; + + switch (state) { + case VIR_CGROUP_FREEZER_STATE_THAWED: + val =3D 0; break; + case VIR_CGROUP_FREEZER_STATE_FROZEN: + val =3D 1; break; + case VIR_CGROUP_FREEZER_STATE_FREEZING: + case VIR_CGROUP_FREEZER_STATE_LAST: + default: + virReportEnumRangeError(virCgroupFreezerState, state); + return -1; + } + + return virCgroupSetValueU64(group, + VIR_CGROUP_CONTROLLER_FREEZER, + "cgroup.freeze", + val); +} + + +static int +virCgroupV2GetFreezerState(virCgroup *group, + virCgroupFreezerState *state) +{ + unsigned long long freezeReqested; + g_autofree char *eventsStr =3D NULL; + const char *frozenStr =3D "frozen "; + const char *tmp; + + if (virCgroupGetValueU64(group, + VIR_CGROUP_CONTROLLER_FREEZER, + "cgroup.freeze", &freezeReqested) < 0) { + + return -1; + } + + if (freezeReqested =3D=3D 0) { + /* No freeze is requested. */ + *state =3D VIR_CGROUP_FREEZER_STATE_THAWED; + return 0; + } else if (freezeReqested !=3D 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown value of freezer controller: %1$llu"), + freezeReqested); + return -1; + } + + /* Now look at cgroup.events at 'frozen' state. If it's 0, then some + * processes inside the CGroup are still being frozen. If it's 1, + * then all processes are frozen. */ + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_FREEZER, + "cgroup.events", &eventsStr) < 0) { + return -1; + } + + if (!eventsStr || + !(tmp =3D strstr(eventsStr, frozenStr))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid format of cgroup.events file")); + return -1; + } + + tmp +=3D strlen(frozenStr); + if (*tmp =3D=3D '0') { + *state =3D VIR_CGROUP_FREEZER_STATE_FREEZING; + } else if (*tmp =3D=3D '1') { + *state =3D VIR_CGROUP_FREEZER_STATE_FROZEN; + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown state of freezer controller: %1$s"), + tmp); + return -1; + } + + return 0; +} + + virCgroupBackend virCgroupV2Backend =3D { .type =3D VIR_CGROUP_BACKEND_TYPE_V2, =20 @@ -1980,6 +2064,9 @@ virCgroupBackend virCgroupV2Backend =3D { .getCpusetMemoryMigrate =3D virCgroupV2GetCpusetMemoryMigrate, .setCpusetCpus =3D virCgroupV2SetCpusetCpus, .getCpusetCpus =3D virCgroupV2GetCpusetCpus, + + .setFreezerState =3D virCgroupV2SetFreezerState, + .getFreezerState =3D virCgroupV2GetFreezerState, }; =20 =20 --=20 2.53.0 From nobody Wed Jun 10 17:27:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777027305; cv=none; d=zohomail.com; s=zohoarc; b=kkut3cqZxB2dD2DSXfBjNqhRr64CbCjs6pRzCgfQmzjgRa1ZHAIdWdEZQ1RL50UGiQqiJ1dSIW/z0YMTBOgteLlpjfu5zo/Ug4d+CggBknTXg9/mvYucl5ufhQP1eA4u8IDa22oxJPWYR5NttBI29+dpAnSNIUAFvSZHsFTOUnk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777027305; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=V0hfZUvgLLU0DaCWtkFFiM4+x7LLQV6WSgDMe5nqfy4=; b=ZRcktzC6YxpucskQgEPi4K5uKmVDomjgCztfp9tkAPDnx1NBNAfE3IcHsWLPgHfTig6pPCUT1HJRBz+ZoBEd9Eq9k66XBIcAkrI9Te32oGp9YsQ1ismfcHiKCMlxBD/VXBsQYsTj6oQbmf9LCqkawjilqkrNrtVCQlvaVid6oro= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777027305344924.66130857169; Fri, 24 Apr 2026 03:41:45 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9DD33419C8; Fri, 24 Apr 2026 06:41:44 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id D7E4F41AE6; Fri, 24 Apr 2026 06:37:23 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B185441961; Fri, 24 Apr 2026 06:36:56 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id CE6F141965 for ; Fri, 24 Apr 2026 06:36:55 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-0Pnz_T1GO9mLNKZ2Gexl-Q-1; Fri, 24 Apr 2026 06:36:53 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2B6C119560B7 for ; Fri, 24 Apr 2026 10:36:53 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 883FC3007572 for ; Fri, 24 Apr 2026 10:36:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777027015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V0hfZUvgLLU0DaCWtkFFiM4+x7LLQV6WSgDMe5nqfy4=; b=O5Od7c9mVgP0UVrqNDNWe2erkHTRDtp7LsPTrstPx1taspKt/MuDcJTun5gv58eobahFIE frazmnn/5hLOzhIe4MbuWJ7a800x8I1kyBkMQz3+V6NDmt/47ob115h2H5IET7SnUMVKL3 RwT7rBdN23iVHeVOvNH+jBAmZERQGOU= X-MC-Unique: 0Pnz_T1GO9mLNKZ2Gexl-Q-1 X-Mimecast-MFC-AGG-ID: 0Pnz_T1GO9mLNKZ2Gexl-Q_1777027013 To: devel@lists.libvirt.org Subject: [PATCH 4/4] virt-host-validate: Suggest different resolution for 'devices' and non-root user Date: Fri, 24 Apr 2026 12:36:45 +0200 Message-ID: <3334d8727cd202bfffc37a862457e7bb4029ae51.1777026960.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: o5kBITN3LeHoZklpiJKwiF7YfroE_3sbynukxp9THPI_1777027013 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QKE2SR3B7QHXT2O6DJOEM6PCLT6LMUDI X-Message-ID-Hash: QKE2SR3B7QHXT2O6DJOEM6PCLT6LMUDI X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777027307892154100 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik Here's the deal: the 'devices' controller as such does not exist in CGroupsV2. The alternative is to load eBPF program that mimics the controller's behavior from CGroupsV1. But, only privileged user can load such program. This means that virt-host-validate (when ran as a regular user) claims 'devices' controller missing (rightfully so), and suggests enabling it in Kconfig. This last bit might be misleading to users [1]. Now, to fix this ideally, all three conditions should be checked (CGroupsV2, 'devices' controller and regular user), but our virCgroup module deliberately hides the version of CGroups. So check for the other two conditions. 1: https://lists.libvirt.org/archives/list/users@lists.libvirt.org/thread/U= SDFFRJK74GYHRGMXOE2FSAA4PQD23RE/ Signed-off-by: Michal Privoznik Reviewed-by: Pavel Hrdina --- tools/virt-host-validate-common.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-c= ommon.c index 6bca661ffc..a0373b03ce 100644 --- a/tools/virt-host-validate-common.c +++ b/tools/virt-host-validate-common.c @@ -218,9 +218,17 @@ int virHostValidateCGroupControllers(const char *hvnam= e, =20 if (!virCgroupHasController(group, i)) { ret =3D VIR_VALIDATE_FAILURE(level); - virValidateFail(level, "Enable '%s' in kernel Kconfig file or " - "mount/enable cgroup controller in your system= ", - cg_name); + + /* Ideally we would also verify that @group is CGroupsV2, but + * our internal APIs hide that fact away, intentionally. */ + if (i =3D=3D VIR_CGROUP_CONTROLLER_DEVICES && geteuid() !=3D 0= ) { + virValidateFail(level, "Controller '%s' not available for = unprivileged users", + cg_name); + } else { + virValidateFail(level, "Enable '%s' in kernel Kconfig file= or " + "mount/enable cgroup controller in your sy= stem", + cg_name); + } } else { virValidatePass(); } --=20 2.53.0