From nobody Sat May 30 15:29:18 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=pass; 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1779211713; cv=none; d=zohomail.com; s=zohoarc; b=QHD8ISnzpTPqAjz5+oHD366SUkyGmFbxTVEeCQLWCtrGFaxfdY3RATBfsWqmV1JunN3nkJJibWVe6co87YW6j/LoX0ULi0GIJMu+MhIwrlBPtxQ1kOspkkjiOl9jJq1cwGLyKDyJ/T+e1t0zVraDAZBUX/s9QDCxdKLlLgVRHF0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779211713; h=Content-Transfer-Encoding:Cc:Cc: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:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=hZg2w8kY7wvGZGXLmId/5IjuUfn3GqLh3NHh+L3aTlM=; b=Jqhc8px/ko3qj/fVT0VMYdvGJM1EF+L3uu91OoSMWxz3bjkXvfZFpOoZhhjm3TcDVGGHw051e6RxCeC1L4VU0HFCXNUFlAnQDTkAlD9quCBFl05pVoqjaYdW2v09YS44JPANZrqvAuJPbW5wznVIW3xcZd5uG7lfmtLBPfKva1s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1779211713155590.9393136568873; Tue, 19 May 2026 10:28:33 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C24534198A; Tue, 19 May 2026 13:28:31 -0400 (EDT) Received: from [172.19.199.5] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id C086E41B3C; Tue, 19 May 2026 13:25:46 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 959A241960; Tue, 19 May 2026 13:25:28 -0400 (EDT) Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) (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 51B7B4195D for ; Tue, 19 May 2026 13:25:27 -0400 (EDT) Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-678a16429c6so6996406a12.1 for ; Tue, 19 May 2026 10:25:27 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-68311670e02sm6604575a12.22.2026.05.19.10.25.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2026 10:25:25 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779211526; x=1779816326; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hZg2w8kY7wvGZGXLmId/5IjuUfn3GqLh3NHh+L3aTlM=; b=WUsnu+ZCSqsocEo8PZ2nFlVlbyzI0+fyQqDwxdLDgTMztWmY+74G8ulKoUXXdZPas/ /fanvXCp0yrDn/zGNfosLx/QQxUm/G3g4SJOVZZolkLGMK03MLKoPEiivTDxlBQYKMwH QIIBVK6ASuCoymW2ENp9DbJ8xBeiVN59DqiU7HII2s6xZ3WPhEJ72CsgbOlq1s/euKXO 8XaeM01lOptiqLhT1i2v/9bhVX1Mr3eC0abdJDtduN/BBMxdgiErouZKBnN0iN1pjPb3 3/q0JSzNnj7EENZERirVsdLBFgasH3rVMs7tcNeclPkuB1h/s+6fBDi3FBOas19CSehS /DzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779211526; x=1779816326; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hZg2w8kY7wvGZGXLmId/5IjuUfn3GqLh3NHh+L3aTlM=; b=gRrZmtlrB0u9WwcjU6pdVV/+RsbhrICLyZDVjc5GwWml2B5h4oV+3tHRwQ4mVyIPVj sM017ry1nTKR/40D/JnCOfjn7mpJxzUEcpIWSBHk64wARsT3VIHDb2V5hZmTuaHnDN1T caDdVHLOLO1pBdHNFi+SQDUivf7J7naMn5XVIml6OayeXUxXTk9hpRZuyKkJ/bNoF8qk QoSqDFlLLX+Bdraun6J1A3z3/awSrJYXOtaoSldtQPSxm6d/V52+jm5BgBmkcMepvfiy GaC08KxtEpjal/xv1cSPpPudG8x5KQrl/Alnh7+emyuNj2foQt8XJ6eASvzSfihimwwS eRQw== X-Gm-Message-State: AOJu0YyNgz4Z68ws0YsC6xQHJrG75dMDqNTESVAzbL3aO7/hJ0nqtIze rl5/LO/mY9WpFsD8gWRAFQjGp2FZtOO5HCMUSB5SS8yHxGnnKydBIKThdSXhqxv/ X-Gm-Gg: Acq92OHH6kDi1tnUv8o1cyPBQl3BCKkm/VdeFLg75kAjypr5KYFqZacIhzRW+xAv4FN h9ryBtoYjce8S6CZq8xgJduIFotBb6iWlbvZstjnMDzJm3C08ZrAcv7e00HIy4hDNH/XFZWvS5X uF0WmqebhPM6BlOgI+0ifQy/2t/NaiEulIPT76I74Pv1PAQ3Hi5nIUSwB3JhZPoyLHWxaS/sIMu gtQqZLuNtShXeaxRaavW6+/Ffcn0fa8xt+YpCE/ybZhRRvVtmugClhUcCUd8KRR6wSGt8uti95C b/WkUbc2feJLwkr6eIDs72nZcNOJ/cYAfn4MhxDMjAkYoaPJFJFGxrcUltWye8kXuaV9rq440jf 1iUxopzV5JNsSdGUlSH8DWzu3xr9b8bAbz8t6moerfwBesj4lIWMnMMY0O2QZwyITIAHw0Bq+jl 9jC+jgsP629abKK/gV+s69FkyHaHAeUWn+ori3f81DQU/n41SeYoLY+AIW9z34KwTABiQ3n2Y32 2Ry39ROEvUwgRfYR0lFGXyARXfbgfob7aUIKA== X-Received: by 2002:a05:6402:3551:b0:678:a5d1:ca74 with SMTP id 4fb4d7f45d1cf-6830b505da8mr11586548a12.16.1779211525489; Tue, 19 May 2026 10:25:25 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 1/4] bhyve: add memtune support Date: Tue, 19 May 2026 19:21:44 +0200 Message-ID: <20260519172147.30903-2-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260519172147.30903-1-bogorodskiy@gmail.com> References: <20260519172147.30903-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SPJOURQUR67JEZNV3OHBROSYEINKJ6NK X-Message-ID-Hash: SPJOURQUR67JEZNV3OHBROSYEINKJ6NK X-MailFrom: bogorodskiy@gmail.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 CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1779211713738158500 Content-Type: text/plain; charset="utf-8" Add support of the memtune's hard_limit configuration: to the bhyve driver. Just like in the block I/O tuning case, memory limits are set using the rctl(8) tool. Syntax for that is: rctl -a process::memoryuse:deny=3D1073741824 Extend bhyveSetResourceLimits() to execute this command if it's requested by the domain XML. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_domain.c | 8 ++++++ src/bhyve/bhyve_process.c | 26 +++++++++++------ ...vexml2argv-memtune-unsupported-params.args | 10 +++++++ ...xml2argv-memtune-unsupported-params.ldargs | 4 +++ ...yvexml2argv-memtune-unsupported-params.xml | 28 +++++++++++++++++++ .../x86_64/bhyvexml2argv-memtune.args | 10 +++++++ .../x86_64/bhyvexml2argv-memtune.ldargs | 4 +++ .../x86_64/bhyvexml2argv-memtune.xml | 26 +++++++++++++++++ tests/bhyvexml2argvtest.c | 2 ++ 9 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-un= supported-params.args create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-un= supported-params.ldargs create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-un= supported-params.xml create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.ar= gs create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.ld= args create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.xml diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 6367985efc..86e4de1fd8 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -541,6 +541,14 @@ bhyveDomainDefValidate(const virDomainDef *def, } } =20 + if (virMemoryLimitIsSet(def->mem.soft_limit) || + virMemoryLimitIsSet(def->mem.swap_hard_limit) || + def->mem.min_guarantee) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only 'hard_limit' memory tuning parameter is= supported by bhyve")); + return -1; + } + if (!def->os.loader) return 0; =20 diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 7652a998e5..7baefeb63b 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -53,6 +53,7 @@ #include "virnetdevbridge.h" #include "virnetdevtap.h" #include "virtime.h" +#include "virutil.h" =20 #define VIR_FROM_THIS VIR_FROM_BHYVE =20 @@ -138,7 +139,8 @@ bhyveSetResourceLimits(struct _bhyveConn *driver, virDo= mainObj *vm) { virBlkioDevice *device; =20 - if (vm->def->blkio.ndevices !=3D 1) + if ((vm->def->blkio.ndevices !=3D 1) && + !virMemoryLimitIsSet(vm->def->mem.hard_limit)) return 0; =20 if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_RCTL) =3D=3D 0) { @@ -147,24 +149,30 @@ bhyveSetResourceLimits(struct _bhyveConn *driver, vir= DomainObj *vm) return -1; } =20 - device =3D &vm->def->blkio.devices[0]; - -#define BHYVE_APPLY_RCTL_RULE(field, type, format) \ +#define BHYVE_APPLY_RCTL_RULE(field, type, action, format) \ do { \ if ((field)) { \ g_autofree char *rule =3D NULL; \ g_autoptr(virCommand) cmd =3D virCommandNewArgList("rctl", "-a= ", NULL); \ - virCommandAddArgFormat(cmd, "process:%d:" type ":throttle=3D" = format, \ + virCommandAddArgFormat(cmd, "process:%d:" type ":" action "=3D= " format, \ vm->pid, (field)); \ if (virCommandRun(cmd, NULL) < 0) \ return -1; \ } \ } while (0) =20 - BHYVE_APPLY_RCTL_RULE(device->riops, "readiops", "%u"); - BHYVE_APPLY_RCTL_RULE(device->wiops, "writeiops", "%u"); - BHYVE_APPLY_RCTL_RULE(device->rbps, "readbps", "%llu"); - BHYVE_APPLY_RCTL_RULE(device->wbps, "writebps", "%llu"); + if (vm->def->blkio.ndevices =3D=3D 1) { + device =3D &vm->def->blkio.devices[0]; + + BHYVE_APPLY_RCTL_RULE(device->riops, "readiops", "throttle", "%u"); + BHYVE_APPLY_RCTL_RULE(device->wiops, "writeiops", "throttle", "%u"= ); + BHYVE_APPLY_RCTL_RULE(device->rbps, "readbps", "throttle", "%llu"); + BHYVE_APPLY_RCTL_RULE(device->wbps, "writebps", "throttle", "%llu"= ); + } + + /* rctl(8) uses bytes for these values and def->mem.* uses kibibytes */ + if (virMemoryLimitIsSet(vm->def->mem.hard_limit)) + BHYVE_APPLY_RCTL_RULE(vm->def->mem.hard_limit * 1024, "memoryuse",= "deny", "%llu"); =20 #undef BHYVE_APPLY_RCTL_RULE =20 diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupport= ed-params.args b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsup= ported-params.args new file mode 100644 index 0000000000..507e0be668 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupported-para= ms.args @@ -0,0 +1,10 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=3D52:54:00:b9:94:02 \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupport= ed-params.ldargs b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-uns= upported-params.ldargs new file mode 100644 index 0000000000..5905f4b3e6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupported-para= ms.ldargs @@ -0,0 +1,4 @@ +bhyveload \ +-m 214 \ +-d /tmp/freebsd.img \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupport= ed-params.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupp= orted-params.xml new file mode 100644 index 0000000000..af1e25805d --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune-unsupported-para= ms.xml @@ -0,0 +1,28 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + + 512 + 1 + 128 + + 1 + + hvm + + + + + + +
+ + + + + +
+ + + diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.args b/te= sts/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.args new file mode 100644 index 0000000000..507e0be668 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.args @@ -0,0 +1,10 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=3D52:54:00:b9:94:02 \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.ldargs b/= tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.ldargs new file mode 100644 index 0000000000..5905f4b3e6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.ldargs @@ -0,0 +1,4 @@ +bhyveload \ +-m 214 \ +-d /tmp/freebsd.img \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.xml b/tes= ts/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.xml new file mode 100644 index 0000000000..f8bcd23296 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-memtune.xml @@ -0,0 +1,26 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + + 512 + + 1 + + hvm + + + + + + +
+ + + + + +
+ + + diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index eb2c1d33b8..818b51e178 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -301,6 +301,8 @@ mymain(void) DO_TEST_FAILURE("virtio-console-too-many-ports"); DO_TEST_FAILURE("virtio-console-invalid-name"); DO_TEST_FAILURE("virtio-console-invalid-path"); + DO_TEST("memtune"); + DO_TEST_FAILURE("memtune-unsupported-params"); =20 /* Address allocation tests */ DO_TEST("addr-single-sata-disk"); --=20 2.52.0 From nobody Sat May 30 15:29:18 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=pass; 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1779211797; cv=none; d=zohomail.com; s=zohoarc; b=Du7Jk+qglh0joxIMJ5vr0CAQQYhrgp51hACGJ90FxQL3nEKP13DFvHZ53VOpvFlyqPAR42dHrTICHkLYx3sJxLbBiaF7FvUiRqRtkaHLpa/15jeFbYxXqTjlUC4/9Zq5U6R55/GL96OhPX3z+vMhagE7VDONWGEqN/luIE7IKlw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779211797; h=Content-Transfer-Encoding:Cc:Cc: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:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=KzPvJU16DTkJd/ygnDv5fGznx0/n1M4UaG6xCLHE1TE=; b=WbO44ULyHDVONbTTEp23jHZr3+QajDmBoEUNzWjs7x69+AepeLgmLLDEODx4W/cxhehdx4i0wGx7MeHspXzJanSebbMWaEqUz3+YY6A4q8T/iYM7719Rxt3ps1q50ytlU24F6KAiWPYracaIYRIQEZBBxbwTKRIipyUfBPbPyQw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1779211797160553.8589191363592; Tue, 19 May 2026 10:29:57 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E8E454197B; Tue, 19 May 2026 13:29:55 -0400 (EDT) Received: from [172.19.199.5] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 93FD341A4E; Tue, 19 May 2026 13:25:51 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 58D3E41962; Tue, 19 May 2026 13:25:29 -0400 (EDT) Received: from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com [IPv6:2a00:1450:4864:20::62e]) (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 2AE2A4195B for ; Tue, 19 May 2026 13:25:28 -0400 (EDT) Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-b936331786dso501778666b.3 for ; Tue, 19 May 2026 10:25:28 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-68311670e02sm6604575a12.22.2026.05.19.10.25.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2026 10:25:25 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779211527; x=1779816327; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KzPvJU16DTkJd/ygnDv5fGznx0/n1M4UaG6xCLHE1TE=; b=UBObHRE3JuzcKCBRPLj8VBr+7OH67EpNZ2/L7GnhD2vZi1egn0y+/4tAuK0Q3SrW4c soh0LSvq+YM39m60xn7vJyZWo0TMZnjVAjfnADVl3HhoAXJjXL5W1o5vRo9muttdNJGF Aj6N6Gz8PB2F/6rxQsmS47l/lQyR9yh43x1fUsDrySBu7D3ZgGme74sMgSRMwZQH8K8s OVT5IlQYsqBdXHqF0I2A59gQdtWQvfdSs0rGVFgRZy0KUiPBHzmIG1NKFwUZPM/hkpZi EK+5w9z2iQ5DTKdz0BtfjGcT0Mv8egha1rfIFPVPljnrIJYcxt9WNzTriiiCYmT6yvvE zNVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779211527; x=1779816327; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=KzPvJU16DTkJd/ygnDv5fGznx0/n1M4UaG6xCLHE1TE=; b=nrfn5llAS81mVPNT6xxTCI23g/EB8dKF5dQ2mKwq4sONFooMdFtVj7U7Lgx9V2QUMJ 0l2BRSeRxpvj++0xNT+FGRiJOmaS4LCpp3PvvkmFGdBsJMiajiQSY4BMymMHqUdbS/bN msg4zNph6Inlfbi17RvU296uVvw59rVWjghWWILWW2FDdFnXjXrmRgULAHY/k+oWRXj1 M8rQ29eARjiFtaPsXOL0MIxX8L2iXg++8rRczryPRddxmJp2AQDtIQGbwBEvEpLQiZXQ RgoACVnU5IjLemo8PpOw2LOikb7BIqEPDddrnurCrFWzbFLUt1Ne0W00DpnLyMXdZCBu X4lw== X-Gm-Message-State: AOJu0YzG4pMghUPdNt+QKUsfxDEP9u4GxvaCQdQgKW5OzbxaWuU7aagi cd56FV7h+7n6l0YYZ8mzwtsPFBIHgkfD1/TMamrP/BRnayNfdLGwcUqdxu2PRGG+ X-Gm-Gg: Acq92OER3UkgnivGLVWuIFN7qXbfdD8nkuV1iGCTGhXuBMNDQTz57zYLmpldEVxSfiu 08mho9RKylTV6MAYWsdHGJ0c1XbtTc2f9yTLPTdxi1SpYJgYTZbZtPL5pef2UR9tlQM8IO7fi08 crPhOjr/p67FAiKusQDbQh6N43T4S6hkRnfIbqZCPMF59wgVUQvUSQcBaIO/KABSg2rA9ojWPCQ G/33oa+PVHnCPEeszBj8rU0gvdnBVo3BQHbRONzFSyJF1nMnhskcbLt5Gy4jD7Rc21dx14a08cB SuK34Gn1TgEU/HEKbZHKRsDm3SDYdK2zidnEik9w8ZoXH5f+N1Ra+/kWBVNumPuhRuJPxr1CK8M 8IM1/l5h/f50LWirlcI3fcerx+7LHImMq/c45M9EsgFArECM/+Ivgk0zytUtmEHEchx/6PenOI6 xFEEQ3BkrFTsJTjIq3nrRKReFMroxBr16XkrcQOOPvMuAuazYVhnIUalp5VtRkS8WE9rynMzHPM GHtPpvnPyuAgeqm+/Vq1zwhz84tT+zyQM9P7K/lxYt9+meV X-Received: by 2002:a17:906:9fc6:b0:bd8:5ef9:9b34 with SMTP id a640c23a62f3a-bd85ef9a07bmr476382266b.48.1779211526340; Tue, 19 May 2026 10:25:26 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 2/4] bhyve: implement the domainGetMemoryParameters API Date: Tue, 19 May 2026 19:21:45 +0200 Message-ID: <20260519172147.30903-3-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260519172147.30903-1-bogorodskiy@gmail.com> References: <20260519172147.30903-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: C74ONY7FH32WTPUQE6MUFZD2KXUGFBQT X-Message-ID-Hash: C74ONY7FH32WTPUQE6MUFZD2KXUGFBQT X-MailFrom: bogorodskiy@gmail.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 CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1779211798640158500 Content-Type: text/plain; charset="utf-8" Implement the domainGetMemoryParameters() API for the bhyve driver. To parse live limits execute rctl(8) to list the active rules and parse them. Introduce the bhyve_rctl.c for working with rctl(8). Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_driver.c | 59 +++++++++++++++++++++++ src/bhyve/bhyve_rctl.c | 101 +++++++++++++++++++++++++++++++++++++++ src/bhyve/bhyve_rctl.h | 24 ++++++++++ src/bhyve/meson.build | 1 + 4 files changed, 185 insertions(+) create mode 100644 src/bhyve/bhyve_rctl.c create mode 100644 src/bhyve/bhyve_rctl.h diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index c9b0caff7a..9c373d363b 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -70,6 +70,7 @@ #include "bhyve_domain.h" #include "bhyve_process.h" #include "bhyve_capabilities.h" +#include "bhyve_rctl.h" =20 #define VIR_FROM_THIS VIR_FROM_BHYVE =20 @@ -2167,6 +2168,63 @@ bhyveDomainGetHostname(virDomainPtr domain, return hostname; } =20 + +#define BHYVE_NB_MEM_PARAM 1 +#define BHYVE_ASSIGN_MEM_PARAM(index, name, value) \ + if (index < *nparams && \ + virTypedParameterAssign(¶ms[index], name, VIR_TYPED_PARAM_ULLO= NG, \ + value) < 0) \ + goto cleanup + +static int +bhyveDomainGetMemoryParameters(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) +{ + virDomainObj *vm =3D NULL; + virDomainDef *persistentDef =3D NULL; + int ret =3D -1; + unsigned long long mem_hard_limit; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG | + VIR_TYPED_PARAM_STRING_OKAY, -1); + + if (!(vm =3D bhyveDomObjFromDomain(domain))) + return -1; + + if (virDomainGetMemoryParametersEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjGetDefs(vm, flags, NULL, &persistentDef) < 0) + goto cleanup; + + if ((*nparams) =3D=3D 0) { + *nparams =3D BHYVE_NB_MEM_PARAM; + ret =3D 0; + goto cleanup; + } + + if (persistentDef) { + mem_hard_limit =3D persistentDef->mem.hard_limit; + } else { + if (bhyveRctlGetMemoryHardLimit(vm->pid, &mem_hard_limit) < 0) + goto cleanup; + } + + BHYVE_ASSIGN_MEM_PARAM(0, VIR_DOMAIN_MEMORY_HARD_LIMIT, mem_hard_limit= ); + + if (BHYVE_NB_MEM_PARAM < *nparams) + *nparams =3D BHYVE_NB_MEM_PARAM; + ret =3D 0; + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} +#undef BHYVE_ASSIGN_MEM_PARAM + static virHypervisorDriver bhyveHypervisorDriver =3D { .name =3D "bhyve", .connectURIProbe =3D bhyveConnectURIProbe, @@ -2236,6 +2294,7 @@ static virHypervisorDriver bhyveHypervisorDriver =3D { .domainInterfaceAddresses =3D bhyveDomainInterfaceAddresses, /* 12.3.0= */ .domainGetHostname =3D bhyveDomainGetHostname, /* 12.3.0 */ .domainQemuAgentCommand =3D bhyveDomainQemuAgentCommand, /* 12.4.0 */ + .domainGetMemoryParameters =3D bhyveDomainGetMemoryParameters, /* 12.4= .0 */ }; =20 =20 diff --git a/src/bhyve/bhyve_rctl.c b/src/bhyve/bhyve_rctl.c new file mode 100644 index 0000000000..69467d2e34 --- /dev/null +++ b/src/bhyve/bhyve_rctl.c @@ -0,0 +1,101 @@ +/* + * bhyve_rctl.c: Resource limits management with rctl(8) + * + * Copyright (C) 2026 The FreeBSD Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include +#include +#include +#include + +#include "bhyve_rctl.h" +#include "vircommand.h" +#include "viralloc.h" +#include "virerror.h" +#include "virfile.h" +#include "virlog.h" +#include "virobject.h" +#include "virstring.h" + +#define VIR_FROM_THIS VIR_FROM_BHYVE + +VIR_LOG_INIT("bhyve.bhyve_rctl"); + + +static int +bhyveRctlGetAmountFromRule(const char *rule, unsigned long long *amount) +{ + /* From rctl(8): + * + * Syntax for a rule is subject:subject-id:resource:action=3Damount/pe= r. + * A valid rule has all those fields specified, except for per, which + * defaults to the value of subject. + */ + g_auto(GStrv) tokens =3D NULL; + unsigned long long bytes; + + if (!(tokens =3D g_strsplit_set(rule, "=3D/", 0))) + return -1; + + if (g_strv_length(tokens) < 2) + return -1; + + if (virStrToLong_ull(tokens[1], NULL, 10, &bytes) < 0) + return -1; + + *amount =3D bytes / 1024; + + return 0; +} + +int +bhyveRctlGetMemoryHardLimit(pid_t pid, unsigned long long *kb) +{ + g_auto(GStrv) lines =3D NULL; + g_autofree char *outbuf =3D NULL; + g_autoptr(virCommand) cmd =3D NULL; + size_t i; + + cmd =3D virCommandNew("rctl"); + virCommandAddArgFormat(cmd, "process:%d:memoryuse", pid); + virCommandSetOutputBuffer(cmd, &outbuf); + if (virCommandRun(cmd, NULL) < 0) { + *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + return -1; + } + + /* Empty output means no matching rules, thus no limits */ + if (strlen(outbuf) =3D=3D 0) { + *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + return 0; + } + + if (!(lines =3D g_strsplit(outbuf, "\n", 0))) + return -1; + + /* There could be multiple actions for a resource, such as + * 'log' for example, so we need to look for the 'deny' action + * specifically */ + for (i =3D 0; lines[i]; i++) + if (strstr(lines[i], ":deny=3D")) + return bhyveRctlGetAmountFromRule(lines[i], kb); + + return -1; +} diff --git a/src/bhyve/bhyve_rctl.h b/src/bhyve/bhyve_rctl.h new file mode 100644 index 0000000000..46f102c38e --- /dev/null +++ b/src/bhyve/bhyve_rctl.h @@ -0,0 +1,24 @@ +/* + * bhyve_rctl.h: Resource limits management with rctl(8) + * + * Copyright (C) 2026 The FreeBSD Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#pragma once + +int +bhyveRctlGetMemoryHardLimit(pid_t pid, unsigned long long *kb); diff --git a/src/bhyve/meson.build b/src/bhyve/meson.build index 11920d9c3e..c6dd5660da 100644 --- a/src/bhyve/meson.build +++ b/src/bhyve/meson.build @@ -9,6 +9,7 @@ bhyve_sources =3D files( 'bhyve_driver.c', 'bhyve_monitor.c', 'bhyve_process.c', + 'bhyve_rctl.c', ) =20 driver_source_files +=3D bhyve_sources --=20 2.52.0 From nobody Sat May 30 15:29:18 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=pass; 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1779211866; cv=none; d=zohomail.com; s=zohoarc; b=K2XYgFM9VFa39xSFltvftHVfZCEKbJZY0PbVOPmFZT0r+9KdjvM31dsjCSDQtR42N9ZZM2Wxh/9SItu3pcMN70jK2gtifYCEwFSYiPQ5TX0nFhCqtNA+0yqfEQftky9bB0iohD7RdAIvLyDwC8lg0kfgMoJupyzbMEHNFOKR4jM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779211866; h=Content-Transfer-Encoding:Cc:Cc: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:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=EZxygr4uBGZC00Bpzej/36Ey0UdVnFvzJVFmDW4Y9Oo=; b=aCR2GFYECZsdKAULDTGAtN1ebfLQlTyhmI0TGCc6Zgy/oDlDrRAXoStNJjxQn2QawYmBHrWQcDFIzR6hpwUfcmSOshfTpXG0+5tlsVt8lE/eiZ/T+sszHD8FUBsfAkr8VvMbVjWmYD0Sn9Cfqx0HLIz+edqG60SCzi4XOWdrkEc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1779211866123766.5390182109304; Tue, 19 May 2026 10:31:06 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 5475B4196C; Tue, 19 May 2026 13:31:05 -0400 (EDT) Received: from [172.19.199.5] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id ECEC741BCB; Tue, 19 May 2026 13:25:56 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EAE444195B; Tue, 19 May 2026 13:25:29 -0400 (EDT) Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) (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 0AB644195C for ; Tue, 19 May 2026 13:25:29 -0400 (EDT) Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-bd0209f25c1so683668466b.2 for ; Tue, 19 May 2026 10:25:28 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-68311670e02sm6604575a12.22.2026.05.19.10.25.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2026 10:25:26 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779211528; x=1779816328; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EZxygr4uBGZC00Bpzej/36Ey0UdVnFvzJVFmDW4Y9Oo=; b=Qo4mWv41EVuA6R3fsOVy3OGBwdmKMaBzWbp7TuLcYL9tiMsAi0MHe2Czzkae24jau/ Cow+VhtxxtzEjtP9frqQUmOaFPCiFnyUQF/TAj9H2Cd7opd59RTA9NM0o8gy2E0Gt0D/ f3Yb13npdT4twD19c2zwah2fJ+nLgoxhCr+OaN1b8BYWzq4w7dC/XTb6wTuQSAing4Oj MhphsgYY7eY5fnlNEefMTvKYQ9A00qNkAFqoEBHowNe/Dx1KN5/ZV3DbKE4D5O+73DZF bzih+x23F3XYqESw6JtqYlKDTlene6yhQTypsCfghaDysSohdDze+K4crL2B/DICfLlx dR6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779211528; x=1779816328; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=EZxygr4uBGZC00Bpzej/36Ey0UdVnFvzJVFmDW4Y9Oo=; b=Olf+3s26oiRIgcJxYPiUT0/DPgxwgHUMVrx4uCBf6Xxow2HGdhUu1meCIQpPWtwvC7 uY/j0Bt3msjfwTdD/e4ASIqmyBFFk++5xqkwdHnzA9af7dNCp+PLyCdevW6ws7z3BOBH OD/Fd/RS0vLxAr9BMI8KXbfXhl58NDpqE3q8pU1qF1X+GtjNoVf/j5FgL+P9ShabUEVa cD7ZiEGA1ZAjAHU5mMZHdhGBNz8085mwC/rCyPZ2aVBurnkJh5iaiF5GWDpBxqoXCvQs PG/GO9mNTqiw6NbTfdZB15HPLXOaQFjHOYlYbsQU84TqT9ErxTYSp/30ziUUfT7Sj/LY 1BVQ== X-Gm-Message-State: AOJu0Yzcc0VR/Ux50pCyWODlqpoDBR61+p21rAOXXD8EJITz8sgDhqd1 iJ+GOAQgBKTlNg3Ve/ah1rq/TVWu/q69Gm9nQsuMarwFpAsdO0R89xKjJzIKU9nT X-Gm-Gg: Acq92OF7aDvzHZw1OwJb4AJxzSUtEX4+cSTbXCt1ltqkQnoOeHdJA06MkqQZkWUe+24 QtgA2sqq4P7He7xfKueUJNOcZF9CFrRnzX4x1Jm58r00cKiaXwBHP5DQBeMWO22EI9VkDDGr/Yo MxPpdBmB31h4KmZxFITKWM14iq0i3ZLfnD/wpS3DDORbDhxuTsp7S9IgMowjZGfzkVNf0BVsubR akmB5pIAlLWO12gCGi4rFYQM4+FHgejBTXhjieFb2VRzPrHsKoDKYzyqnNctD2UZne1iypGseRA zzWxB9S9cmioWVpXWSg7v3xtFes/BKMNtG0Qb9Mv/gnXYMjhjVtb80OmKdBhQ+9ODlFS9fT8L04 AHyb7r0VzkFD/IE0W8PNVp7dhyY2QVi/SPubg5X1N4/yWiLdRUSdsn6H5ZsFg+lxfffYd4IQ13C ougeoku2ANoe2IwtDcEEb4x8zx+A2E9F6UP5CBhl1vbQ4UfDpqkUJOyT+g3dQ0nxYyOCzyeenXL fiP/FTJZxzFF6sikIvqo8XnRzY11GEctEibNbWDXmty7S2T X-Received: by 2002:a17:907:ca29:b0:bce:a1fc:6877 with SMTP id a640c23a62f3a-bd5179604demr801881566b.24.1779211527192; Tue, 19 May 2026 10:25:27 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 3/4] bhyve: process: factor out rctl(8) code Date: Tue, 19 May 2026 19:21:46 +0200 Message-ID: <20260519172147.30903-4-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260519172147.30903-1-bogorodskiy@gmail.com> References: <20260519172147.30903-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: O2BQAJ2QN4SBGFJYGRBTQNIZ55PAJYBZ X-Message-ID-Hash: O2BQAJ2QN4SBGFJYGRBTQNIZ55PAJYBZ X-MailFrom: bogorodskiy@gmail.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 CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1779211868909154100 Content-Type: text/plain; charset="utf-8" Factor out all rctl(8) execution code to bhyve_rctl.c. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_process.c | 24 ++++-------------------- src/bhyve/bhyve_rctl.c | 34 ++++++++++++++++++++++++++++++++++ src/bhyve/bhyve_rctl.h | 8 ++++++++ 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 7baefeb63b..92665419d4 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -39,13 +39,13 @@ #include "bhyve_firmware.h" #include "bhyve_monitor.h" #include "bhyve_process.h" +#include "bhyve_rctl.h" #include "datatypes.h" #include "virerror.h" #include "virhook.h" #include "virlog.h" #include "virfile.h" #include "viralloc.h" -#include "vircommand.h" #include "virstring.h" #include "virpidfile.h" #include "virprocess.h" @@ -149,32 +149,16 @@ bhyveSetResourceLimits(struct _bhyveConn *driver, vir= DomainObj *vm) return -1; } =20 -#define BHYVE_APPLY_RCTL_RULE(field, type, action, format) \ - do { \ - if ((field)) { \ - g_autofree char *rule =3D NULL; \ - g_autoptr(virCommand) cmd =3D virCommandNewArgList("rctl", "-a= ", NULL); \ - virCommandAddArgFormat(cmd, "process:%d:" type ":" action "=3D= " format, \ - vm->pid, (field)); \ - if (virCommandRun(cmd, NULL) < 0) \ - return -1; \ - } \ - } while (0) - if (vm->def->blkio.ndevices =3D=3D 1) { device =3D &vm->def->blkio.devices[0]; =20 - BHYVE_APPLY_RCTL_RULE(device->riops, "readiops", "throttle", "%u"); - BHYVE_APPLY_RCTL_RULE(device->wiops, "writeiops", "throttle", "%u"= ); - BHYVE_APPLY_RCTL_RULE(device->rbps, "readbps", "throttle", "%llu"); - BHYVE_APPLY_RCTL_RULE(device->wbps, "writebps", "throttle", "%llu"= ); + bhyveRctlSetIoLimits(vm->pid, device); } =20 /* rctl(8) uses bytes for these values and def->mem.* uses kibibytes */ if (virMemoryLimitIsSet(vm->def->mem.hard_limit)) - BHYVE_APPLY_RCTL_RULE(vm->def->mem.hard_limit * 1024, "memoryuse",= "deny", "%llu"); - -#undef BHYVE_APPLY_RCTL_RULE + if (bhyveRctlSetMemoryHardLimit(vm->pid, vm->def->mem.hard_limit) = < 0) + return -1; =20 return 0; } diff --git a/src/bhyve/bhyve_rctl.c b/src/bhyve/bhyve_rctl.c index 69467d2e34..c9e8e26cc4 100644 --- a/src/bhyve/bhyve_rctl.c +++ b/src/bhyve/bhyve_rctl.c @@ -99,3 +99,37 @@ bhyveRctlGetMemoryHardLimit(pid_t pid, unsigned long lon= g *kb) =20 return -1; } + +#define BHYVE_APPLY_RCTL_RULE(pid, field, type, action, format) \ + do { \ + if ((field)) { \ + g_autofree char *rule =3D NULL; \ + g_autoptr(virCommand) cmd =3D virCommandNewArgList("rctl", "-a= ", NULL); \ + virCommandAddArgFormat(cmd, "process:%d:" type ":" action "=3D= " format, \ + pid, (field)); \ + if (virCommandRun(cmd, NULL) < 0) \ + return -1; \ + } \ + } while (0) + +int +bhyveRctlSetMemoryHardLimit(pid_t pid, unsigned long long kb) +{ + /* rctl(8) uses bytes for these values and def->mem.* uses kibibytes */ + BHYVE_APPLY_RCTL_RULE(pid, kb * 1024, "memoryuse", "deny", "%llu"); + + return 0; +} + +int +bhyveRctlSetIoLimits(pid_t pid, const virBlkioDevice *device) +{ + BHYVE_APPLY_RCTL_RULE(pid, device->riops, "readiops", "throttle", "%u"= ); + BHYVE_APPLY_RCTL_RULE(pid, device->wiops, "writeiops", "throttle", "%u= "); + BHYVE_APPLY_RCTL_RULE(pid, device->rbps, "readbps", "throttle", "%llu"= ); + BHYVE_APPLY_RCTL_RULE(pid, device->wbps, "writebps", "throttle", "%llu= "); + + return 0; +} + +#undef BHYVE_APPLY_RCTL_RULE diff --git a/src/bhyve/bhyve_rctl.h b/src/bhyve/bhyve_rctl.h index 46f102c38e..83d4a32013 100644 --- a/src/bhyve/bhyve_rctl.h +++ b/src/bhyve/bhyve_rctl.h @@ -20,5 +20,13 @@ =20 #pragma once =20 +#include "domain_conf.h" + int bhyveRctlGetMemoryHardLimit(pid_t pid, unsigned long long *kb); + +int +bhyveRctlSetMemoryHardLimit(pid_t pid, unsigned long long kb); + +int +bhyveRctlSetIoLimits(pid_t pid, const virBlkioDevice *device); --=20 2.52.0 From nobody Sat May 30 15:29:18 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=pass; 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1779211938; cv=none; d=zohomail.com; s=zohoarc; b=ZSiDyGSlsyk/kimRiaRTklS640HP2dDJ3CHvYdHQgyjsUkdDd1kc24w67GIoN9HJAWHg6Mf7BtiDVH6kv2lUmNBZ4Bfc+ca3nFU+XCVcJPbx/+rFctXOlm+0ZrwqUp9e7ExPt2es/D/1Qnl8FD4M/VserQOTiY0uFfv9rEQsGRo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779211938; h=Content-Transfer-Encoding:Cc:Cc: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:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=1RZChIVDeH54wTeUNRctcFMtTuYzyMRcLW/TSH681yw=; b=TJKCwEp2i0C5mMSdd5BdQ/NYYSLJQ1B1IOt5zgrspEZ4SUOYEE/H/92rzm3kIOLSUrTsKRaYyHfqLk+Uy+hEc2nxfyFEP+VbL/rDkL+xAXQ2LK5cOKXSYarI0HdAEHWG7f37TnS8JJDGA95/y5bvVzmXrF7MJyUU1ioEOu588x4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1779211938379800.0831108468235; Tue, 19 May 2026 10:32:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 5722B4195B; Tue, 19 May 2026 13:32:17 -0400 (EDT) Received: from [172.19.199.5] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 48F3D41C4E; Tue, 19 May 2026 13:26:03 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 578DD4195C; Tue, 19 May 2026 13:25:30 -0400 (EDT) Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) (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 44C204195E for ; Tue, 19 May 2026 13:25:29 -0400 (EDT) Received: by mail-ed1-x52c.google.com with SMTP id 4fb4d7f45d1cf-67fd8befac7so9266638a12.2 for ; Tue, 19 May 2026 10:25:29 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-68311670e02sm6604575a12.22.2026.05.19.10.25.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2026 10:25:27 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779211528; x=1779816328; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1RZChIVDeH54wTeUNRctcFMtTuYzyMRcLW/TSH681yw=; b=Qd8kAakXOEmFrMG5lUporMs6NNyb2TvRWh9oma+e0cwRPo77qpkitw9le2XpaF8Wqb vByovKIh/JPa8x6CLAx+3BDS7AcY0vLg1wcaBXh1XQuL80zo72Dljjg/OHWOTn3qYrxJ 5eMANUNgMV6IwhFip9ZUZglziZYyyEir1eMPMN/C52zHWyoG4xuYKyDj4YLDjmRvq80S 2ohQLVCg3FxO7iYEkFj6b0deSqSBBmQEGRnobZE74xmTz0LjyKrknVNV9uge3HvzIJPX QC0Qn64n13PWsuXXBZqPFZUI6tRH21byj6hDupqvScBTrY5TbjWUF6+BN+6CHJJUVUT0 op+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779211528; x=1779816328; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1RZChIVDeH54wTeUNRctcFMtTuYzyMRcLW/TSH681yw=; b=pe2ZHUi6C+QPsc93L/dDGFtunQ4YfypbtHukuffieflmtZ3Q7zhDJp8gBjJfslrYyC nRjbsiiU14ovqwH4hAaFOPQCK80iPIgQNfuOuyVQb9p2qOdWOSwGZkaPk0bMXqHbsUNI PAwLd9EVo2eVHXytUtB2CIL9lXGks4a89xFi0WfjeWVZZVjugw8CXn8wyDFfrlODg8W6 1O/EEKYUbA+h571YgxpIXIJJnMOP3xs8yFitDyG5FS7f7GdIMQIuItqWCfEiPixgOGM6 NLhtPU3vsaQS8QWhYJB1XmoSvIoYEQc17ZIQkjKLQQG/bSEFphbXpaiB5APYNKTSCtCo SShQ== X-Gm-Message-State: AOJu0YxHO9UTv4322uho7TK8/cCY0mgJYcd92OvYwCe7klLT0654sifS 2jiWxE52FZU47aKJrpOK6QTB5vPYm2WZTLFBAkSUfltQ1nXLreLCHRRJ/hoh9y9w X-Gm-Gg: Acq92OHOrn29bo36pyurkyQloNFv8Gp9bACWSIk5AE59JWDyRFdtc/t+TxoO9TtiSr4 mNSP3yToTAf3XOOXs5NkvVZzSVfTrDS7T/YF0H4SGtamZpireHGJbXoymn6dXKNEPg3bwxViNHg cpOGiSQUrhwbnQM/8Ni0wTXrr0X1fnMQBIgnjKwF4MB9m9DDEXh2AgpR5YjMW4iWmmBEMSWCiRL vb9CaJ4PwF4muMjRP1LuY1bM6dB4IGdrJHwPBPaEC2VxZ8MmTvR8zipDQF0DURJVVsvgq/ss2a9 7bO+3+c5fD9JwJGXtsNB40nV9+naHWxggxcrpsu6bE26tkveEQOmSIkr5/viQ9w8cQaMdpVYikT D8vQaoPgt/5NHzrde6WttSHHSIXB7kNHoPQdy/eQTN9PR/BGT2195Po96bMXyS4tzl7YRCG+5rU MigFGJ1NSpgojo3sUQOdiW9A57Fb4m04LzLO2celmIpfua7TfJDY+VALEKR3/uaINAs8qv4SzG8 8144PX20lqBYcGLVN4zdNSxyTeAl3jtvSANDdYo4xoUbPEo X-Received: by 2002:a05:6402:234c:b0:66e:378d:2e56 with SMTP id 4fb4d7f45d1cf-683bcc9b7b6mr11136263a12.6.1779211527841; Tue, 19 May 2026 10:25:27 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 4/4] bhyve: implement the domainSetMemoryParameters API Date: Tue, 19 May 2026 19:21:47 +0200 Message-ID: <20260519172147.30903-5-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260519172147.30903-1-bogorodskiy@gmail.com> References: <20260519172147.30903-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QL7254TQXUWO45MH5C73A2IUHM2Y5EAN X-Message-ID-Hash: QL7254TQXUWO45MH5C73A2IUHM2Y5EAN X-MailFrom: bogorodskiy@gmail.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 CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1779211940250154100 Content-Type: text/plain; charset="utf-8" Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_driver.c | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 9c373d363b..331d9eb439 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -2225,6 +2225,76 @@ bhyveDomainGetMemoryParameters(virDomainPtr domain, } #undef BHYVE_ASSIGN_MEM_PARAM =20 +static int +bhyveDomainSetMemoryParameters(virDomainPtr domain, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ + struct _bhyveConn *privconn =3D domain->conn->privateData; + virDomainDef *def =3D NULL; + virDomainDef *persistentDef =3D NULL; + virDomainObj *vm =3D NULL; + int ret =3D -1; + unsigned long long hard_limit =3D 0; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_MEMORY_HARD_LIMIT, + VIR_TYPED_PARAM_ULLONG, + NULL) < 0) + return -1; + + + if (!(vm =3D bhyveDomObjFromDomain(domain))) + return -1; + + if (virDomainSetMemoryParametersEnsureACL(domain->conn, vm->def, flags= ) < 0) + goto cleanup; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0) + goto endjob; + + if (virTypedParamsGetULLong(params, nparams, VIR_DOMAIN_MEMORY_HARD_LI= MIT, &hard_limit) < 0) + return -1; + + if (def) { + if ((bhyveDriverGetBhyveCaps(privconn) & BHYVE_CAP_RCTL) =3D=3D 0)= { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Cannot set resource limits: RACCT/RCTL is ei= ther not supported or not enabled")); + goto endjob; + } + + if (bhyveRctlSetMemoryHardLimit(vm->pid, hard_limit) < 0) + goto endjob; + + def->mem.hard_limit =3D hard_limit; + if (virDomainObjSave(vm, privconn->xmlopt, BHYVE_STATE_DIR) < 0) + VIR_WARN("Failed to save status on vm %s", vm->def->name); + } + + if (persistentDef) { + persistentDef->mem.hard_limit =3D hard_limit; + + if (virDomainDefSave(persistentDef, privconn->xmlopt, BHYVE_CONFIG= _DIR) < 0) + goto endjob; + } + + ret =3D 0; + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + static virHypervisorDriver bhyveHypervisorDriver =3D { .name =3D "bhyve", .connectURIProbe =3D bhyveConnectURIProbe, @@ -2295,6 +2365,7 @@ static virHypervisorDriver bhyveHypervisorDriver =3D { .domainGetHostname =3D bhyveDomainGetHostname, /* 12.3.0 */ .domainQemuAgentCommand =3D bhyveDomainQemuAgentCommand, /* 12.4.0 */ .domainGetMemoryParameters =3D bhyveDomainGetMemoryParameters, /* 12.4= .0 */ + .domainSetMemoryParameters =3D bhyveDomainSetMemoryParameters, /* 12.4= .0 */ }; =20 =20 --=20 2.52.0