From: Peter Krempa <[email protected]>

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 <[email protected]>
---
 src/qemu/qemu_domain.c  | 17 +++++++++++++++++
 src/qemu/qemu_domain.h  |  3 +++
 src/qemu/qemu_hotplug.c | 29 +++++++++++++++++++++++++++++
 src/qemu/qemu_process.c | 10 ++++++++++
 4 files changed, 59 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 8e1ebe7799..bdab117e96 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -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:
  *
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 3361e97315..30ca67bf76 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -1078,6 +1078,9 @@ int
 qemuDomainInitializePflashStorageSource(virDomainObj *vm,
                                         virQEMUDriverConfig *cfg);

+bool
+qemuDomainDiskHasLatencyHistogram(virDomainDiskDef *disk);
+
 bool
 qemuDomainDiskBlockJobIsSupported(virDomainDiskDef *disk);

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index ffd7795b66..df61f17723 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -7327,6 +7327,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;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 411c5b3b88..3d9db188fc 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7958,6 +7958,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;
 }

-- 
2.52.0

Reply via email to