Add support for reading the iothread poll-weight value from QEMU and
exposing it via domain stats.

Add poll_weight and set_poll_weight fields to qemuMonitorIOThreadInfo
and parse the poll-weight property from the QMP query-iothreads
response. The property is optional and only present on newer QEMU
binaries.

Expose the fetched value through the domain stats interface by adding
VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_WEIGHT and reporting it in
qemuDomainGetStatsIOThread when the value is available.

Signed-off-by: Jaehoon Kim <[email protected]>
---
 docs/manpages/virsh.rst          |  2 ++
 include/libvirt/libvirt-domain.h | 10 ++++++++++
 src/qemu/qemu_driver.c           |  5 +++++
 src/qemu/qemu_monitor.h          |  2 ++
 src/qemu/qemu_monitor_json.c     |  5 +++++
 5 files changed, 24 insertions(+)

diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index a10d29e0ea..8465f19c12 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -2905,6 +2905,8 @@ not available for statistical purposes.
   growth is managed by the hypervisor.
 * ``iothread.<id>.poll-shrink`` - polling time shrink value. A value of
   (zero) indicates shrink is managed by hypervisor.
+* ``iothread.<id>.poll-weight`` - polling weight shift value. A value of 0
+  (zero) indicates the hypervisor's default weight is used.
 
 *--memory* returns:
 
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index f4dfe9fb1a..bb524f41ee 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -4330,6 +4330,16 @@ struct _virDomainStatsRecord {
  */
 # define VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_SHRINK ".poll-shrink"
 
+/**
+ * VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_WEIGHT:
+ *
+ * Polling weight factor as an unsigned int. This shift value controls how
+ * much the most recent event interval affects adaptive polling calculations.
+ * A 0 (zero) indicates the hypervisor's default weight is used.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_WEIGHT ".poll-weight"
 
 /**
  * VIR_DOMAIN_STATS_MEMORY_BANDWIDTH_MONITOR_COUNT:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 44b41726fb..842b56a2c2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18411,6 +18411,11 @@ qemuDomainGetStatsIOThread(virQEMUDriver *driver 
G_GNUC_UNUSED,
                                          VIR_DOMAIN_STATS_IOTHREAD_PREFIX "%u" 
VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_SHRINK,
                                          iothreads[i]->iothread_id);
         }
+        if (iothreads[i]->set_poll_weight) {
+            virTypedParamListAddUInt(params, iothreads[i]->poll_weight,
+                                     VIR_DOMAIN_STATS_IOTHREAD_PREFIX "%u" 
VIR_DOMAIN_STATS_IOTHREAD_SUFFIX_POLL_WEIGHT,
+                                     iothreads[i]->iothread_id);
+        }
     }
 
     for (i = 0; i < niothreads; i++)
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 3298095e9c..e560618bf4 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1583,11 +1583,13 @@ struct _qemuMonitorIOThreadInfo {
     unsigned long long poll_max_ns;
     unsigned long long poll_grow;
     unsigned long long poll_shrink;
+    unsigned int poll_weight;
     int thread_pool_min;
     int thread_pool_max;
     bool set_poll_max_ns;
     bool set_poll_grow;
     bool set_poll_shrink;
+    bool set_poll_weight;
     bool set_thread_pool_min;
     bool set_thread_pool_max;
 };
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index af9a77ed3b..b02c0722d9 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -7202,6 +7202,11 @@ qemuMonitorJSONGetIOThreads(qemuMonitor *mon,
             virJSONValueObjectGetNumberUlong(child, "poll-shrink",
                                              &info->poll_shrink) == 0)
             info->poll_valid = true;
+
+        /* poll-weight is optional, only present on newer QEMU */
+        if (virJSONValueObjectGetNumberUint(child, "poll-weight",
+                                            &info->poll_weight) == 0)
+            info->set_poll_weight = true;
     }
 
     *niothreads = n;
-- 
2.54.0

Reply via email to