From: Chun Feng Wu <danielwuwy@163.com>
This change contains QMP requests for ThrottleGroup
* ThrottleGroup is updated through "qemuMonitorJSONUpdateThrottleGroup"
* ThrottleGroup is retrieved through "qemuMonitorJSONGetThrottleGroup"
* ThrottleGroup is deleted by reusing "qemuMonitorDelObject"
* ThrottleGroup is added by reusing "qemuMonitorAddObject"
* "qemuMonitorMakeThrottleGroupLimits" will be used by building qemu cmd as well
Signed-off-by: Chun Feng Wu <danielwuwy@163.com>
* change throttle group config conversions P to U allow zero.
* Apply suggested coding style changes.
Signed-off-by: Harikumar Rajkumar <harirajkumar230@gmail.com>
---
src/qemu/qemu_monitor.c | 34 +++++++++
src/qemu/qemu_monitor.h | 14 ++++
src/qemu/qemu_monitor_json.c | 129 +++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 14 ++++
4 files changed, 191 insertions(+)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c069d17265..015f8f11cc 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3037,6 +3037,40 @@ qemuMonitorGetBlockIoThrottle(qemuMonitor *mon,
}
+int
+qemuMonitorThrottleGroupLimits(virJSONValue *limits,
+ const virDomainThrottleGroupDef *group)
+{
+ return qemuMonitorMakeThrottleGroupLimits(limits, group);
+}
+
+
+int
+qemuMonitorUpdateThrottleGroup(qemuMonitor *mon,
+ const char *qomid,
+ virDomainBlockIoTuneInfo *info)
+{
+ VIR_DEBUG("qomid=%s, info=%p", qomid, info);
+
+ QEMU_CHECK_MONITOR(mon);
+
+ return qemuMonitorJSONUpdateThrottleGroup(mon, qomid, info);
+}
+
+
+int
+qemuMonitorGetThrottleGroup(qemuMonitor *mon,
+ const char *groupname,
+ virDomainBlockIoTuneInfo *reply)
+{
+ VIR_DEBUG("throttle-group=%s, reply=%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 f7b9263b64..7b58d988d8 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1074,6 +1074,20 @@ int qemuMonitorGetBlockIoThrottle(qemuMonitor *mon,
const char *qdevid,
virDomainBlockIoTuneInfo *reply);
+int
+qemuMonitorThrottleGroupLimits(virJSONValue *limits,
+ const virDomainThrottleGroupDef *group);
+
+int
+qemuMonitorUpdateThrottleGroup(qemuMonitor *mon,
+ const char *qomid,
+ virDomainBlockIoTuneInfo *info);
+
+int
+qemuMonitorGetThrottleGroup(qemuMonitor *mon,
+ const char *groupname,
+ virDomainBlockIoTuneInfo *reply);
+
int qemuMonitorSystemWakeup(qemuMonitor *mon);
int qemuMonitorGetVersion(qemuMonitor *mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 554572b13d..572fdb944d 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -4685,6 +4685,135 @@ int qemuMonitorJSONGetBlockIoThrottle(qemuMonitor *mon,
return qemuMonitorJSONBlockIoThrottleInfo(devices, qdevid, reply);
}
+
+int
+qemuMonitorMakeThrottleGroupLimits(virJSONValue *limits,
+ const virDomainThrottleGroupDef *group)
+{
+ if (virJSONValueObjectAdd(&limits,
+ "U:bps-total", group->total_bytes_sec,
+ "U:bps-read", group->read_bytes_sec,
+ "U:bps-write", group->write_bytes_sec,
+ "U:iops-total", group->total_iops_sec,
+ "U:iops-read", group->read_iops_sec,
+ "U:iops-write", group->write_iops_sec,
+ "U:bps-total-max", group->total_bytes_sec_max,
+ "U:bps-read-max", group->read_bytes_sec_max,
+ "U:bps-write-max", group->write_bytes_sec_max,
+ "U:iops-total-max", group->total_iops_sec_max,
+ "U:iops-read-max", group->read_iops_sec_max,
+ "U:iops-write-max", group->write_iops_sec_max,
+ "U:iops-size", group->size_iops_sec,
+ "P:bps-total-max-length", group->total_bytes_sec_max_length,
+ "P:bps-read-max-length", group->read_bytes_sec_max_length,
+ "P:bps-write-max-length", group->write_bytes_sec_max_length,
+ "P:iops-total-max-length", group->total_iops_sec_max_length,
+ "P:iops-read-max-length", group->read_iops_sec_max_length,
+ "P:iops-write-max-length", group->write_iops_sec_max_length,
+ NULL) < 0)
+ return -1;
+
+ return 0;
+}
+
+
+int
+qemuMonitorJSONUpdateThrottleGroup(qemuMonitor *mon,
+ const char *qomid,
+ virDomainBlockIoTuneInfo *info)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) result = NULL;
+ g_autoptr(virJSONValue) limits = virJSONValueNewObject();
+
+ if (qemuMonitorMakeThrottleGroupLimits(limits, info) < 0)
+ return -1;
+
+ if (!(cmd = qemuMonitorJSONMakeCommand("qom-set",
+ "s:property", "limits",
+ "s:path", qomid,
+ "a:value", &limits,
+ NULL)))
+ return -1;
+
+ if (qemuMonitorJSONCommand(mon, cmd, &result) < 0)
+ return -1;
+
+ if (qemuMonitorJSONCheckError(cmd, result) < 0)
+ return -1;
+
+ return 0;
+}
+
+
+#define GET_THROTTLE_GROUP_VALUE(FIELD, STORE) \
+ if (virJSONValueObjectHasKey(ret, FIELD)) { \
+ if (virJSONValueObjectGetNumberUlong(ret, FIELD, &reply->STORE) < 0) { \
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, \
+ _("value of throttle group field '%1$s' is malformed"), \
+ #STORE); \
+ return -1; \
+ } \
+ }
+
+
+int
+qemuMonitorJSONGetThrottleGroup(qemuMonitor *mon,
+ const char *gname,
+ virDomainBlockIoTuneInfo *reply)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) result = NULL;
+ g_autofree char *groupCopy = NULL;
+ virJSONValue *ret;
+
+ /* prefix group name with "throttle-" in QOM */
+ g_autofree char *path = g_strdup_printf("/objects/throttle-%s", gname);
+ if (!(cmd = qemuMonitorJSONMakeCommand("qom-get",
+ "s:path", path,
+ "s:property", "limits",
+ NULL)))
+ return -1;
+
+ if (qemuMonitorJSONCommand(mon, cmd, &result) < 0)
+ return -1;
+
+ if (qemuMonitorJSONCheckError(cmd, result) < 0)
+ return -1;
+
+ if (!(ret = qemuMonitorJSONGetReply(cmd, result, VIR_JSON_TYPE_OBJECT)))
+ return -1;
+
+ GET_THROTTLE_GROUP_VALUE("bps-total", total_bytes_sec);
+ GET_THROTTLE_GROUP_VALUE("bps-read", read_bytes_sec);
+ GET_THROTTLE_GROUP_VALUE("bps-write", write_bytes_sec);
+ GET_THROTTLE_GROUP_VALUE("iops-total", total_iops_sec);
+ GET_THROTTLE_GROUP_VALUE("iops-read", read_iops_sec);
+ GET_THROTTLE_GROUP_VALUE("iops-write", write_iops_sec);
+
+ GET_THROTTLE_GROUP_VALUE("bps-total-max", total_bytes_sec_max);
+ GET_THROTTLE_GROUP_VALUE("bps-read-max", read_bytes_sec_max);
+ GET_THROTTLE_GROUP_VALUE("bps-write-max", write_bytes_sec_max);
+ GET_THROTTLE_GROUP_VALUE("iops-total-max", total_iops_sec_max);
+ GET_THROTTLE_GROUP_VALUE("iops-read-max", read_iops_sec_max);
+ GET_THROTTLE_GROUP_VALUE("iops-write-max", write_iops_sec_max);
+ GET_THROTTLE_GROUP_VALUE("iops-size", size_iops_sec);
+
+ GET_THROTTLE_GROUP_VALUE("bps-total-max-length", total_bytes_sec_max_length);
+ GET_THROTTLE_GROUP_VALUE("bps-read-max-length", read_bytes_sec_max_length);
+ GET_THROTTLE_GROUP_VALUE("bps-write-max-length", write_bytes_sec_max_length);
+ GET_THROTTLE_GROUP_VALUE("iops-total-max-length", total_iops_sec_max_length);
+ GET_THROTTLE_GROUP_VALUE("iops-read-max-length", read_iops_sec_max_length);
+ GET_THROTTLE_GROUP_VALUE("iops-write-max-length", write_iops_sec_max_length);
+
+ groupCopy = g_strdup(gname);
+ reply->group_name = g_steal_pointer(&groupCopy);
+
+ return 0;
+}
+#undef GET_THROTTLE_GROUP_VALUE
+
+
int qemuMonitorJSONSystemWakeup(qemuMonitor *mon)
{
g_autoptr(virJSONValue) cmd = NULL;
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 25e3ae2cbb..23c845ac76 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -375,6 +375,20 @@ qemuMonitorJSONSetBlockIoThrottle(qemuMonitor *mon,
const char *qomid,
virDomainBlockIoTuneInfo *info);
+int
+qemuMonitorMakeThrottleGroupLimits(virJSONValue *limits,
+ const virDomainThrottleGroupDef *group);
+
+int
+qemuMonitorJSONUpdateThrottleGroup(qemuMonitor *mon,
+ const char *qomid,
+ virDomainBlockIoTuneInfo *info);
+
+int
+qemuMonitorJSONGetThrottleGroup(qemuMonitor *mon,
+ const char *gname,
+ virDomainBlockIoTuneInfo *reply);
+
int
qemuMonitorJSONGetBlockIoThrottle(qemuMonitor *mon,
const char *qdevid,
--
2.39.5 (Apple Git-154)
On Wed, Feb 19, 2025 at 22:27:09 +0530, Harikumar Rajkumar wrote: > From: Chun Feng Wu <danielwuwy@163.com> > > This change contains QMP requests for ThrottleGroup > > * ThrottleGroup is updated through "qemuMonitorJSONUpdateThrottleGroup" > * ThrottleGroup is retrieved through "qemuMonitorJSONGetThrottleGroup" > * ThrottleGroup is deleted by reusing "qemuMonitorDelObject" > * ThrottleGroup is added by reusing "qemuMonitorAddObject" > * "qemuMonitorMakeThrottleGroupLimits" will be used by building qemu cmd as well > > Signed-off-by: Chun Feng Wu <danielwuwy@163.com> > > * change throttle group config conversions P to U allow zero. > * Apply suggested coding style changes. > > Signed-off-by: Harikumar Rajkumar <harirajkumar230@gmail.com> > --- > src/qemu/qemu_monitor.c | 34 +++++++++ > src/qemu/qemu_monitor.h | 14 ++++ > src/qemu/qemu_monitor_json.c | 129 +++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor_json.h | 14 ++++ > 4 files changed, 191 insertions(+) > > diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c > index c069d17265..015f8f11cc 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c [...] > +int > +qemuMonitorGetThrottleGroup(qemuMonitor *mon, > + const char *groupname, > + virDomainBlockIoTuneInfo *reply) The getter is used only in tests which makes no sense. If it's not used just don't add it. I've noticed it by this hunk bein misplaced.
On Wed, Feb 19, 2025 at 22:27:09 +0530, Harikumar Rajkumar wrote: > From: Chun Feng Wu <danielwuwy@163.com> > > This change contains QMP requests for ThrottleGroup > > * ThrottleGroup is updated through "qemuMonitorJSONUpdateThrottleGroup" > * ThrottleGroup is retrieved through "qemuMonitorJSONGetThrottleGroup" > * ThrottleGroup is deleted by reusing "qemuMonitorDelObject" > * ThrottleGroup is added by reusing "qemuMonitorAddObject" > * "qemuMonitorMakeThrottleGroupLimits" will be used by building qemu cmd as well > > Signed-off-by: Chun Feng Wu <danielwuwy@163.com> > > * change throttle group config conversions P to U allow zero. > * Apply suggested coding style changes. > > Signed-off-by: Harikumar Rajkumar <harirajkumar230@gmail.com> > --- > src/qemu/qemu_monitor.c | 34 +++++++++ > src/qemu/qemu_monitor.h | 14 ++++ > src/qemu/qemu_monitor_json.c | 129 +++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor_json.h | 14 ++++ > 4 files changed, 191 insertions(+) Reviewed-by: Peter Krempa <pkrempa@redhat.com>
© 2016 - 2025 Red Hat, Inc.