From nobody Sun Dec 7 13:26:08 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; 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 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1739984810305682.4897862853273; Wed, 19 Feb 2025 09:06:50 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 216041A9C; Wed, 19 Feb 2025 12:06:49 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 4D6FF1DC8; Wed, 19 Feb 2025 12:02:24 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 97C1A1CE0; Wed, 19 Feb 2025 12:02:18 -0500 (EST) Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 505A11D77 for ; Wed, 19 Feb 2025 12:01:55 -0500 (EST) Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-220f4dd756eso101352175ad.3 for ; Wed, 19 Feb 2025 09:01:55 -0800 (PST) Received: from localhost.localdomain ([2001:4490:4ea9:8374:8512:e327:fdaf:a56e]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-220d558fe3asm106651545ad.234.2025.02.19.09.01.50 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 19 Feb 2025 09:01:52 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739984513; x=1740589313; 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=INk3aq3hq7GZ7KvF5GgKGMZFhyji3FkczSUzfzvJqZI=; b=I+oO9MHBUr0OqTk75tQMPBYBGqWIMyyahUmqMlZS7e5K2esUlXaScY471o1SGaAZif DfbPtUgz95xN0UBLqaDZXKjXFOWvcKAm4plmmSl7z1AujZ4bjeg/f/CgZVquNpFf1zib GGRKnH/8SZ3y+400/fLM5BQ25RgzHMw27xcK2VmeP+kpLrEukUmehPIomjP576jjEyQ0 +DFmHqtlWuqZS21AOngdH34VFyUwvNezs2b12HmCrx+b4WjrifvNnWzY91FP+2XvRUDN 72/7UCFR0PfGN5yF4WN++LawLuTKqtm7+nESAZ+rq5anpVpi1rVDbMd+lBljZ96M+1ds psiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739984513; x=1740589313; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=INk3aq3hq7GZ7KvF5GgKGMZFhyji3FkczSUzfzvJqZI=; b=dbxefvv2cIRxGmmpk9kvcsMMgttxsdhN2DeLBFfZ17mcROzHNV0tQyVwj1bB/FgtIs YabI4xMr9BtsBYCx22zCLrEwxUtNdBaFsHPUt9wloWQdWZB57xc6l2I81i/jJXTz9qUf LwPno6Bveg5A/AN2RKpisR0ApB/4hHNPFdLh+zACXXr8a+LPHaqmpad4EgtjUr2OFEQw oENZQdnY1OMJbPC0H69p9o3l5KDrU1f5pjyRUKO3x/jsSpOBFF8uv6Onet7QcbCkaFRv Zn2L2TAfUcfW5tcHg4yM8D+OCW2+km2r3D20GTA9htuWl+vOdZKv4Y7Caj3K0XOfG36A gElQ== X-Gm-Message-State: AOJu0Yx82nZ5qKrEMEK3XICt3V8ErnxrbdZBcyfL1uWMJbDbQ3i+b5TJ 3R0nnEmvI+iUY8Gb2Wcmcu+Ly1nrj1uKr0b7mw8oH3NGhKJXvhdHyNgXtPNl X-Gm-Gg: ASbGncvN0P5DvlWWgFOiprdJUpw/krOYYQpmKhw3WtsSneNvVsgc65eM9R8BPz/wKK8 vk+jNeDKyXQQA1NhreEIgH43eqBXKhlQbIs0u82Ng5S48sX5tLNrbUJQr4acrLMWwraWNEs1hEE BFsEPOq7Lj/ZxI4obixuKU6UR/hAE1uyZ2IeaBi7jhb9uDklawqFXMLN6C3GuFz2Jj/MavSCRjj pTSkpuAwiY7IhsKTaHwgOUhkpauPLdhpAIs7OnERbuGvT+vaW7ZFkqPoW+AuwXChsQoq5Du84rc x8NTsVWpvm/JrYAu8eF6k/HnHsO5gVpzxiAzT9jKqHVNYQ6LdL9CtZ6P3w== X-Google-Smtp-Source: AGHT+IGROQy25vpRYX2u+7F80am3yraGxljNK1ly04UecHUdD3rjueJFmDeG33EYmfMoRJZZ+Bzldg== X-Received: by 2002:a17:902:f54e:b0:220:ca08:8986 with SMTP id d9443c01a7336-2210402d6b2mr346200125ad.22.1739984513324; Wed, 19 Feb 2025 09:01:53 -0800 (PST) From: Harikumar Rajkumar To: devel@lists.libvirt.org Subject: [PATCH v8 07/18] remote: New APIs for ThrottleGroup lifecycle management Date: Wed, 19 Feb 2025 22:27:11 +0530 Message-Id: <20250219165722.26348-8-harirajkumar230@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250219165722.26348-1-harirajkumar230@gmail.com> References: <20250219165722.26348-1-harirajkumar230@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: WEBDAUVLLILGF62E2FMQXVFFZ4NOPJO2 X-Message-ID-Hash: WEBDAUVLLILGF62E2FMQXVFFZ4NOPJO2 X-MailFrom: harirajkumar230@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: sanjeev.ranjan@ibm.com, harikumar.rajkumar@ibm.com, earulana@in.ibm.com, Chun Feng Wu , Harikumar Rajkumar X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1739984811786019100 Content-Type: text/plain; charset="utf-8" From: Chun Feng Wu Defined new public APIs: * virDomainSetThrottleGroup to add or update throttlegroup within specific = domain, it will be referenced by throttlefilter later in disk to do limits * virDomainGetThrottleGroup to get throttlegroup info, old-style is discard= ed (APIs to query first for the number of parameters and then give it a reasonably-sized pointer), instead, the new approach is adopted that API returns allocated array of fields and number of fileds that are in it. * virDomainDelThrottleGroup to delete throttlegroup, it fails if this throt= tlegroup is still referenced by some throttlefilter Signed-off-by: Chun Feng Wu * Reimplement getter API to fetch data from XML. * Apply suggested coding style changes. * Update of code documentation comments. * Update the version to 11.1.0. Signed-off-by: Harikumar Rajkumar --- include/libvirt/libvirt-domain.h | 14 ++++ src/driver-hypervisor.h | 14 ++++ src/libvirt-domain.c | 122 ++++++++++++++++++++++++++++ src/libvirt_private.syms | 8 ++ src/libvirt_public.syms | 6 ++ src/qemu/qemu_monitor.c | 13 --- src/qemu/qemu_monitor.h | 5 -- src/remote/remote_daemon_dispatch.c | 105 ++++++++++++++++++++++++ src/remote/remote_driver.c | 3 + src/remote/remote_protocol.x | 50 +++++++++++- src/remote_protocol-structs | 28 +++++++ 11 files changed, 349 insertions(+), 19 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index f5420bca6e..a34dafc705 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -6612,4 +6612,18 @@ virDomainGraphicsReload(virDomainPtr domain, unsigned int type, unsigned int flags); =20 + +int +virDomainSetThrottleGroup(virDomainPtr dom, + const char *group, + virTypedParameterPtr params, + int nparams, + unsigned int flags); + +int +virDomainDelThrottleGroup(virDomainPtr dom, + const char *group, + unsigned int flags); + + #endif /* LIBVIRT_DOMAIN_H */ diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 4ce8da078d..124b1a12e3 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1453,6 +1453,18 @@ typedef int unsigned int type, unsigned int flags); =20 +typedef int +(*virDrvDomainSetThrottleGroup)(virDomainPtr dom, + const char *groupname, + virTypedParameterPtr params, + int nparams, + unsigned int flags); + +typedef int +(*virDrvDomainDelThrottleGroup)(virDomainPtr dom, + const char *groupname, + unsigned int flags); + typedef struct _virHypervisorDriver virHypervisorDriver; =20 /** @@ -1726,4 +1738,6 @@ struct _virHypervisorDriver { virDrvDomainStartDirtyRateCalc domainStartDirtyRateCalc; virDrvDomainFDAssociate domainFDAssociate; virDrvDomainGraphicsReload domainGraphicsReload; + virDrvDomainSetThrottleGroup domainSetThrottleGroup; + virDrvDomainDelThrottleGroup domainDelThrottleGroup; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 072cc32255..326bbd9abb 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -14162,3 +14162,125 @@ virDomainGraphicsReload(virDomainPtr domain, virDispatchError(domain->conn); return -1; } + + +/** + * virDomainSetThrottleGroup: + * @dom: pointer to domain object + * @group: throttle group name + * @params: Pointer to blkio parameter objects + * @nparams: Number of blkio parameters (this value can be the same or + * less than the number of parameters supported) + * @flags: bitwise-OR of virDomainModificationImpact + * + * Add throttlegroup or change all of the throttlegroup options + * within specific domain + * + * The @group parameter is the name for new or existing throttlegroup, + * it cannot be NULL, detailed throttlegroup info is included in @params, + * it either creates new throttlegroup with @params or updates existing + * throttlegroup with @params, throttlegroup can be referenced by throttle + * filter in attached disk to do limits, the difference from iotune is that + * multiple throttlegroups can be referenced within attached disk + * + * Returns -1 in case of error, 0 in case of success. + * + * Since: 11.1.0 + */ +int +virDomainSetThrottleGroup(virDomainPtr dom, + const char *group, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(dom, "params=3D%p, group=3D'%s', nparams=3D%d, flags= =3D0x%x", + params, group, nparams, flags); + VIR_TYPED_PARAMS_DEBUG(params, nparams); + + virResetLastError(); + + virCheckDomainReturn(dom, -1); + conn =3D dom->conn; + + virCheckReadOnlyGoto(conn->flags, error); + virCheckNonNullArgGoto(group, error); + virCheckPositiveArgGoto(nparams, error); + virCheckNonNullArgGoto(params, error); + + if (virTypedParameterValidateSet(dom->conn, params, nparams) < 0) + goto error; + + if (conn->driver->domainSetThrottleGroup) { + int ret; + ret =3D conn->driver->domainSetThrottleGroup(dom, group, params, n= params, flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(dom->conn); + return -1; +} + + +/** + * virDomainDelThrottleGroup: + * @dom: pointer to domain object + * @group: throttle group name + * @flags: bitwise-OR of virDomainModificationImpact + * + * Delete an throttlegroup from the domain. @group cannot be NULL, + * and the @group to be deleted must not have a throttlefilter associated = with + * it and can be any of the current valid group. + * + * @flags may include VIR_DOMAIN_AFFECT_LIVE or VIR_DOMAIN_AFFECT_CONFIG. + * Both flags may be set. + * If VIR_DOMAIN_AFFECT_LIVE is set, the change affects a running domain + * and may fail if domain is not alive. + * If VIR_DOMAIN_AFFECT_CONFIG is set, the change affects persistent state, + * and will fail for transient domains. If neither flag is specified (that= is, + * @flags is VIR_DOMAIN_AFFECT_CURRENT), then an inactive domain modifies + * persistent setup, while an active domain is hypervisor-dependent on whe= ther + * just live or both live and persistent state is changed. + * + * Returns -1 in case of error, 0 in case of success. + * + * Since: 11.1.0 + */ +int +virDomainDelThrottleGroup(virDomainPtr dom, + const char *group, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(dom, "group=3D'%s', flags=3D0x%x", + group, flags); + + virResetLastError(); + + virCheckDomainReturn(dom, -1); + virCheckNonNullArgGoto(group, error); + + conn =3D dom->conn; + + if (conn->driver->domainDelThrottleGroup) { + int ret; + ret =3D conn->driver->domainDelThrottleGroup(dom, group, flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(dom->conn); + return -1; +} diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 30a9f806f0..df7481c144 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -680,6 +680,14 @@ virDomainTaintMessageTypeFromString; virDomainTaintMessageTypeToString; virDomainTaintTypeFromString; virDomainTaintTypeToString; +virDomainThrottleFilterDefClear; +virDomainThrottleFilterFind; +virDomainThrottleGroupAdd; +virDomainThrottleGroupByName; +virDomainThrottleGroupDefCopy; +virDomainThrottleGroupDefFree; +virDomainThrottleGroupDel; +virDomainThrottleGroupUpdate; virDomainTimerModeTypeFromString; virDomainTimerModeTypeToString; virDomainTimerNameTypeFromString; diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 7a3492d9d7..7448bcb1f0 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -948,4 +948,10 @@ LIBVIRT_10.2.0 { virDomainGraphicsReload; } LIBVIRT_10.1.0; =20 +LIBVIRT_11.1.0 { + global: + virDomainSetThrottleGroup; + virDomainDelThrottleGroup; +} LIBVIRT_10.2.0; + # .... define new API here using predicted next version number .... diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 015f8f11cc..89669ccb15 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3058,19 +3058,6 @@ qemuMonitorUpdateThrottleGroup(qemuMonitor *mon, } =20 =20 -int -qemuMonitorGetThrottleGroup(qemuMonitor *mon, - const char *groupname, - virDomainBlockIoTuneInfo *reply) -{ - VIR_DEBUG("throttle-group=3D%s, reply=3D%p", groupname, reply); - - QEMU_CHECK_MONITOR(mon); - - return qemuMonitorJSONGetThrottleGroup(mon, groupname, reply); -} - - int qemuMonitorVMStatusToPausedReason(const char *status) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 7b58d988d8..c6332630bd 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1083,11 +1083,6 @@ qemuMonitorUpdateThrottleGroup(qemuMonitor *mon, const char *qomid, virDomainBlockIoTuneInfo *info); =20 -int -qemuMonitorGetThrottleGroup(qemuMonitor *mon, - const char *groupname, - virDomainBlockIoTuneInfo *reply); - int qemuMonitorSystemWakeup(qemuMonitor *mon); =20 int qemuMonitorGetVersion(qemuMonitor *mon, diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon= _dispatch.c index e812f5c3e9..2781e70396 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -3618,6 +3618,111 @@ remoteDispatchDomainGetBlockIoTune(virNetServer *se= rver G_GNUC_UNUSED, return rv; } =20 +#define PARSE_THROTTLER_GROUP(val) \ + if (virXPathULongLong("string(./" #val ")", \ + ctxt, &throttleGroup->val) =3D=3D -2) { \ + goto cleanup; \ + } \ + if ((virTypedParamsAddULLong(¶ms, &nparams, &maxparams, \ + #val, throttleGroup->val) < 0)) { \ + goto cleanup; \ + } + +static int +remoteDispatchDomainGetThrottleGroup(virNetServer *server G_GNUC_UNUSED, + virNetServerClient *client, + virNetMessage *hdr G_GNUC_UNUSED, + struct virNetMessageError *rerr, + remote_domain_get_throttle_group_args= *args, + remote_domain_get_throttle_group_ret = *ret) +{ + virDomainPtr dom =3D NULL; + int rv =3D -1; + g_autofree char *doc =3D NULL; + g_autoptr(xmlDoc) xml =3D NULL; + g_autoptr(xmlXPathContext) ctxt =3D NULL; + g_autofree xmlNodePtr *node =3D NULL; + int n =3D 0; + int maxparams =3D 0; + size_t i; + + virTypedParameterPtr params =3D NULL; + int nparams =3D 0; + virConnectPtr conn =3D remoteGetHypervisorConn(client); + + if (!conn) + goto cleanup; + + if (!(dom =3D get_nonnull_domain(conn, args->dom))) + goto cleanup; + virCheckNonNullArgGoto(*args->group, cleanup); + + doc =3D virDomainGetXMLDesc(dom, args->flags); + + if (!(xml =3D virXMLParseStringCtxt(doc, _("(domain_definition)"), &ct= xt))) { + return false; + } + + if ((n =3D virXPathNodeSet("/domain/throttlegroups/throttlegroup", ctx= t, &node)) < 0) + goto cleanup; + + if (n =3D=3D 0) + return 0; + + for (i =3D 0; i < n; i++) { + g_autoptr(virDomainThrottleGroupDef) throttleGroup =3D g_new0(virD= omainThrottleGroupDef, 1); + + VIR_XPATH_NODE_AUTORESTORE(ctxt) + ctxt->node =3D node[i]; + + if (STREQ(*args->group, virXPathString("string(./group_name)", ctx= t)) =3D=3D 0) { + continue; + } + + PARSE_THROTTLER_GROUP(total_bytes_sec); + PARSE_THROTTLER_GROUP(read_bytes_sec); + PARSE_THROTTLER_GROUP(write_bytes_sec); + PARSE_THROTTLER_GROUP(total_iops_sec); + PARSE_THROTTLER_GROUP(read_iops_sec); + PARSE_THROTTLER_GROUP(write_iops_sec); + + PARSE_THROTTLER_GROUP(total_bytes_sec_max); + PARSE_THROTTLER_GROUP(read_bytes_sec_max); + PARSE_THROTTLER_GROUP(write_bytes_sec_max); + PARSE_THROTTLER_GROUP(total_iops_sec_max); + PARSE_THROTTLER_GROUP(read_iops_sec_max); + PARSE_THROTTLER_GROUP(write_iops_sec_max); + + PARSE_THROTTLER_GROUP(size_iops_sec); + + PARSE_THROTTLER_GROUP(total_bytes_sec_max_length); + PARSE_THROTTLER_GROUP(read_bytes_sec_max_length); + PARSE_THROTTLER_GROUP(write_bytes_sec_max_length); + PARSE_THROTTLER_GROUP(total_iops_sec_max_length); + PARSE_THROTTLER_GROUP(read_iops_sec_max_length); + PARSE_THROTTLER_GROUP(write_iops_sec_max_length); + } + + /* Serialize the ThrottleGroup parameters. */ + if (virTypedParamsSerialize(params, nparams, + REMOTE_DOMAIN_THROTTLE_GROUP_PARAMETERS_MA= X, + (struct _virTypedParameterRemote **) &ret-= >params.params_val, + &ret->params.params_len, + args->flags) < 0) + goto cleanup; + + rv =3D 0; + + cleanup: + if (rv < 0) + virNetMessageSaveError(rerr); + virTypedParamsFree(params, nparams); + virObjectUnref(dom); + return rv; +} +#undef PARSE_THROTTLEGROUP + + /*-------------------------------------------------------------*/ =20 static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 307f9ca945..a76212a22b 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2582,6 +2582,7 @@ static int remoteDomainGetBlockIoTune(virDomainPtr do= main, return 0; } =20 + static int remoteDomainGetCPUStats(virDomainPtr domain, virTypedParameterPtr params, unsigned int nparams, @@ -7835,6 +7836,8 @@ static virHypervisorDriver hypervisor_driver =3D { .domainSetLaunchSecurityState =3D remoteDomainSetLaunchSecurityState, = /* 8.0.0 */ .domainFDAssociate =3D remoteDomainFDAssociate, /* 9.0.0 */ .domainGraphicsReload =3D remoteDomainGraphicsReload, /* 10.2.0 */ + .domainSetThrottleGroup =3D remoteDomainSetThrottleGroup, /* 11.1.0 */ + .domainDelThrottleGroup =3D remoteDomainDelThrottleGroup, /* 11.1.0 */ }; =20 static virNetworkDriver network_driver =3D { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 41c045ff78..1d3e8a7a8c 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -113,6 +113,9 @@ const REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX =3D 16; /* Upper limit on list of blockio tuning parameters. */ const REMOTE_DOMAIN_BLOCK_IO_TUNE_PARAMETERS_MAX =3D 32; =20 +/* Upper limit on list of throttle group parameters. */ +const REMOTE_DOMAIN_THROTTLE_GROUP_PARAMETERS_MAX =3D 32; + /* Upper limit on list of numa parameters. */ const REMOTE_DOMAIN_NUMA_PARAMETERS_MAX =3D 16; =20 @@ -1475,6 +1478,29 @@ struct remote_domain_get_block_io_tune_ret { int nparams; }; =20 +struct remote_domain_set_throttle_group_args { + remote_nonnull_domain dom; + remote_nonnull_string group; + remote_typed_param params; + unsigned int flags; +}; + +struct remote_domain_get_throttle_group_args { + remote_nonnull_domain dom; + remote_string group; + unsigned int flags; +}; + +struct remote_domain_get_throttle_group_ret { + remote_typed_param params; +}; + +struct remote_domain_del_throttle_group_args { + remote_nonnull_domain dom; + remote_string group; + unsigned int flags; +}; + struct remote_domain_get_cpu_stats_args { remote_nonnull_domain dom; unsigned int nparams; @@ -7048,5 +7074,27 @@ enum remote_procedure { * @generate: both * @acl: domain:write */ - REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD =3D 448 + REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD =3D 448, + + /** + * @generate: both + * @acl: domain:write + * @acl: domain:save:!VIR_DOMAIN_AFFECT_CONFIG|VIR_DOMAIN_AFFECT_LIVE + * @acl: domain:save:VIR_DOMAIN_AFFECT_CONFIG + */ + REMOTE_PROC_DOMAIN_SET_THROTTLE_GROUP =3D 449, + + /** + * @generate: none + * @acl: domain:read + */ + REMOTE_PROC_DOMAIN_GET_THROTTLE_GROUP =3D 450, + + /** + * @generate: both + * @acl: domain:write + * @acl: domain:save:!VIR_DOMAIN_AFFECT_CONFIG|VIR_DOMAIN_AFFECT_LIVE + * @acl: domain:save:VIR_DOMAIN_AFFECT_CONFIG + */ + REMOTE_PROC_DOMAIN_DEL_THROTTLE_GROUP =3D 451 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 4d3dc2d249..a94e29f9c9 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1050,6 +1050,31 @@ struct remote_domain_get_block_io_tune_ret { } params; int nparams; }; +struct remote_domain_set_throttle_group_args { + remote_nonnull_domain dom; + remote_nonnull_string group; + struct { + u_int params_len; + remote_typed_param * params_val; + } params; + u_int flags; +}; +struct remote_domain_get_throttle_group_args { + remote_nonnull_domain dom; + remote_string group; + u_int flags; +}; +struct remote_domain_get_throttle_group_ret { + struct { + u_int params_len; + remote_typed_param * params_val; + } params; +}; +struct remote_domain_del_throttle_group_args { + remote_nonnull_domain dom; + remote_string group; + u_int flags; +}; struct remote_domain_get_cpu_stats_args { remote_nonnull_domain dom; u_int nparams; @@ -3755,4 +3780,7 @@ enum remote_procedure { REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE =3D 446, REMOTE_PROC_NODE_DEVICE_UPDATE =3D 447, REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD =3D 448, + REMOTE_PROC_DOMAIN_SET_THROTTLE_GROUP =3D 449, + REMOTE_PROC_DOMAIN_GET_THROTTLE_GROUP =3D 450, + REMOTE_PROC_DOMAIN_DEL_THROTTLE_GROUP =3D 451, }; --=20 2.39.5 (Apple Git-154)