]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Setup disk latency histograms on startup/hotplug/update
authorPeter Krempa <pkrempa@redhat.com>
Fri, 23 Jan 2026 16:18:14 +0000 (17:18 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 Feb 2026 09:25:49 +0000 (10:25 +0100)
Setup the histograms on startup and hotplug of devices via
'qemuProcessSetupDiskPropsRuntime' and facilitate update/reset/disable
of histogram collection via 'qemuDomainChangeDiskLive'.

The latter allows to use the update device API to either clear the bins
or select new bin configuration or disable the histogram altogether
without the need for a specific API.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c

index 8e1ebe779977166c3ce56e3cb2da1853b36444e8..bdab117e9650f98d1c781ebb9255f273b74bd2b9 100644 (file)
@@ -10463,6 +10463,23 @@ qemuDomainInitializePflashStorageSource(virDomainObj *vm,
 }
 
 
+/**
+ * qemuDomainDiskHasLatencyHistogram:
+ * @disk: disk definition
+ *
+ * Returns whether @disk has any latency histogram settings configured.
+ */
+bool
+qemuDomainDiskHasLatencyHistogram(virDomainDiskDef *disk)
+{
+    return disk->histogram_boundaries ||
+           disk->histogram_boundaries_read ||
+           disk->histogram_boundaries_write ||
+           disk->histogram_boundaries_zone ||
+           disk->histogram_boundaries_flush;
+}
+
+
 /**
  * qemuDomainDiskBlockJobIsSupported:
  *
index d4f6c256cd20396743922b1abaa685487f610563..510a8339b0ab2f64c6d3dcf0db9a1eb43edd7325 100644 (file)
@@ -1070,6 +1070,9 @@ int
 qemuDomainInitializePflashStorageSource(virDomainObj *vm,
                                         virQEMUDriverConfig *cfg);
 
+bool
+qemuDomainDiskHasLatencyHistogram(virDomainDiskDef *disk);
+
 bool
 qemuDomainDiskBlockJobIsSupported(virDomainDiskDef *disk);
 
index 467efc15a0991daeec97bc81e676636137b1064e..d17370b582766d97c0720207966acea3928351f4 100644 (file)
@@ -7321,6 +7321,35 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
         dev->data.disk->src = NULL;
     }
 
+    if (qemuDomainDiskHasLatencyHistogram(disk) ||
+        qemuDomainDiskHasLatencyHistogram(orig_disk)) {
+        int rc;
+
+        qemuDomainObjEnterMonitor(vm);
+        rc = qemuMonitorBlockLatencyHistogramSet(qemuDomainGetMonitor(vm),
+                                                 QEMU_DOMAIN_DISK_PRIVATE(orig_disk)->qomName,
+                                                 disk->histogram_boundaries,
+                                                 disk->histogram_boundaries_read,
+                                                 disk->histogram_boundaries_write,
+                                                 disk->histogram_boundaries_zone,
+                                                 disk->histogram_boundaries_flush);
+        qemuDomainObjExitMonitor(vm);
+
+        if (rc < 0)
+            return -1;
+
+        g_clear_pointer(&orig_disk->histogram_boundaries, g_free);
+        g_clear_pointer(&orig_disk->histogram_boundaries_read, g_free);
+        g_clear_pointer(&orig_disk->histogram_boundaries_write, g_free);
+        g_clear_pointer(&orig_disk->histogram_boundaries_zone, g_free);
+        g_clear_pointer(&orig_disk->histogram_boundaries_flush, g_free);
+        orig_disk->histogram_boundaries = g_steal_pointer(&disk->histogram_boundaries);
+        orig_disk->histogram_boundaries_read = g_steal_pointer(&disk->histogram_boundaries_read);
+        orig_disk->histogram_boundaries_write = g_steal_pointer(&disk->histogram_boundaries_write);
+        orig_disk->histogram_boundaries_zone = g_steal_pointer(&disk->histogram_boundaries_zone);
+        orig_disk->histogram_boundaries_flush = g_steal_pointer(&disk->histogram_boundaries_flush);
+    }
+
     /* in case when we aren't updating disk source we update startup policy here */
     orig_disk->startupPolicy = dev->data.disk->startupPolicy;
     orig_disk->snapshot = dev->data.disk->snapshot;
index 2e83b447fbd05dd148a42ab7fc7b1f1fc813cae1..c3f681f1dd3ca99ba3a7dfc03a5198fe38a5e4af 100644 (file)
@@ -7963,6 +7963,16 @@ qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon,
                                       &disk->blkdeviotune) < 0)
         return -1;
 
+    if (qemuDomainDiskHasLatencyHistogram(disk) &&
+        qemuMonitorBlockLatencyHistogramSet(mon,
+                                            QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName,
+                                            disk->histogram_boundaries,
+                                            disk->histogram_boundaries_read,
+                                            disk->histogram_boundaries_write,
+                                            disk->histogram_boundaries_zone,
+                                            disk->histogram_boundaries_flush) < 0)
+        return -1;
+
     return 0;
 }