]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: hotplug: Setup disk throttling with blockdev
authorPeter Krempa <pkrempa@redhat.com>
Thu, 5 Sep 2019 13:09:50 +0000 (15:09 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 6 Sep 2019 06:12:21 +0000 (08:12 +0200)
With blockdev we must issue the block_set_io_throttle QMP command to
setup disk throttling as we currently can't do it with the 'throttle'
layer.

Unfortunately there's nothing we can do if it fails.

https://bugzilla.redhat.com/show_bug.cgi?id=1733163

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c

index 30aa6d234498a16355c16dde16af0e146461b615..a7034fd2986fe37375a71d1b5414c3a7f80cf3b2 100644 (file)
@@ -617,6 +617,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver);
     VIR_AUTOPTR(virJSONValue) corProps = NULL;
     VIR_AUTOFREE(char *) corAlias = NULL;
+    bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
 
     if (qemuDomainStorageSourceChainAccessAllow(driver, vm, disk->src) < 0)
         goto cleanup;
@@ -627,7 +628,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0)
         goto error;
 
-    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
+    if (blockdev) {
         if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON &&
             !(corProps = qemuBlockStorageGetCopyOnReadProps(disk)))
         goto cleanup;
@@ -667,6 +668,21 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
         goto exit_monitor;
     }
 
+    /* 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 (blockdev &&
+        qemuDiskConfigBlkdeviotuneEnabled(disk)) {
+        qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
+        if (qemuMonitorSetBlockIoThrottle(priv->mon, NULL, diskPriv->qomName,
+                                          &disk->blkdeviotune,
+                                          true, true, true) < 0)
+            VIR_WARN("failed to set blkdeviotune for '%s' of '%s'", disk->dst, vm->def->name);
+    }
+
     if (qemuDomainObjExitMonitor(driver, vm) < 0) {
         ret = -2;
         goto error;
index c9921646e9523dba3b4f3534e457c068d09d9cc9..61b03c8a2d033fcd83bf360628875f9ffb3ce4cd 100644 (file)
@@ -6671,6 +6671,7 @@ qemuProcessGenID(virDomainObjPtr vm,
  * Sets up disk trottling for -blockdev via block_set_io_throttle monitor
  * command. This hack should be replaced by proper use of the 'throttle'
  * blockdev driver in qemu once it will support changing of the throttle group.
+ * Same hack is done in qemuDomainAttachDiskGeneric.
  */
 static int
 qemuProcessSetupDiskThrottlingBlockdev(virQEMUDriverPtr driver,