From: Peter Krempa <[email protected]>

Introduce 'qemuProcessSetupDiskPropsRuntime' helper function which will
collect all code used for runtime setup of a disk.

This is currently old-style throttling.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/qemu/qemu_hotplug.c | 23 +++++------------------
 src/qemu/qemu_process.c | 37 +++++++++++++++++++++++++++----------
 src/qemu/qemu_process.h |  3 +++
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index f786248e70..ffd7795b66 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -567,13 +567,8 @@ qemuDomainChangeMediaBlockdev(virDomainObj *vm,
     }

     /* set throttling for the new image */
-    if (rc == 0 &&
-        !virStorageSourceIsEmpty(newsrc) &&
-        qemuDiskConfigBlkdeviotuneEnabled(disk)) {
-        rc = qemuMonitorSetBlockIoThrottle(priv->mon,
-                                           diskPriv->qomName,
-                                           &disk->blkdeviotune);
-    }
+    if (rc == 0)
+        rc = qemuProcessSetupDiskPropsRuntime(priv->mon, disk);

     if (rc == 0)
         rc = qemuMonitorBlockdevTrayClose(priv->mon, diskPriv->qomName);
@@ -793,21 +788,13 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm,
     if (rc == 0)
         rc = qemuMonitorAddDeviceProps(priv->mon, &devprops);

-    /* Setup throttling of disk via block_set_io_throttle QMP command. This
-     * is a hack until the 'throttle' blockdev driver will support modification
-     * of the trhottle group. See also qemuProcessSetupDiskThrottlingBlockdev.
-     * As there isn't anything sane to do if this fails, let's just return
-     * success.
-     */
     if (rc == 0) {
         qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
         g_autoptr(GHashTable) blockinfo = NULL;

-        if (qemuDiskConfigBlkdeviotuneEnabled(disk)) {
-            if (qemuMonitorSetBlockIoThrottle(priv->mon, diskPriv->qomName,
-                                              &disk->blkdeviotune) < 0)
-                VIR_WARN("failed to set blkdeviotune for '%s' of '%s'", 
disk->dst, vm->def->name);
-        }
+        /* There isn't anything sane to do if this fails (rollback would
+         * require hot-unplug), let's just return success. */
+        ignore_value(qemuProcessSetupDiskPropsRuntime(priv->mon, disk));

         if ((blockinfo = qemuMonitorGetBlockInfo(priv->mon))) {
             struct qemuDomainDiskInfo *diskinfo;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index c5b2a5fda8..8708c2d66b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7936,6 +7936,32 @@ qemuProcessGenID(virDomainObj *vm,
 }


+/**
+ * qemuProcessSetupDiskPropsRuntime:
+ * @mon: qemu monitor object
+ * @disk: disk definition
+ *
+ * This function expects that caller already entered 'monitor' context.
+ *
+ * Sets up disk properties which are only possible to be set in runtime.
+ */
+int
+qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon,
+                                 virDomainDiskDef *disk)
+{
+    if (virStorageSourceIsEmpty(disk->src))
+        return 0;
+
+    if (qemuDiskConfigBlkdeviotuneEnabled(disk) &&
+        qemuMonitorSetBlockIoThrottle(mon,
+                                      QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName,
+                                      &disk->blkdeviotune) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 /**
  * qemuProcessSetupDiskThrottling:
  *
@@ -7959,16 +7985,7 @@ qemuProcessSetupDiskThrottling(virDomainObj *vm,
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDef *disk = vm->def->disks[i];

-        /* Setting throttling for empty drives fails */
-        if (virStorageSourceIsEmpty(disk->src))
-            continue;
-
-        if (!qemuDiskConfigBlkdeviotuneEnabled(disk))
-            continue;
-
-        if (qemuMonitorSetBlockIoThrottle(qemuDomainGetMonitor(vm),
-                                          
QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName,
-                                          &disk->blkdeviotune) < 0)
+        if (qemuProcessSetupDiskPropsRuntime(qemuDomainGetMonitor(vm), disk) < 
0)
             goto cleanup;
     }

diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 426e11d79e..df78b00abb 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -146,6 +146,9 @@ int qemuProcessPrepareHostStorageSourceChain(virDomainObj 
*vm,
 int qemuProcessPrepareHostStorageDisk(virDomainObj *vm,
                                   virDomainDiskDef *disk);

+int qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon,
+                                     virDomainDiskDef *disk);
+
 int qemuProcessDeleteThreadContext(virDomainObj *vm);

 int qemuProcessLaunch(virConnectPtr conn,
-- 
2.52.0

Reply via email to