[PATCH Libvirt v3 06/10] qemu_process: Setup dirty limit after launching VM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Hyman Huang(黄勇) <yong.huang@xxxxxxxxxx>

The dirty_limit attribute in XML requires setting up the
upper limit of dirty page rate once after launching the
VM, so add the implementation.

Signed-off-by: Hyman Huang(黄勇) <yong.huang@xxxxxxxxxx>
---
 src/qemu/qemu_process.c | 44 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 7a1cdb0302..560051bcaf 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6156,6 +6156,46 @@ qemuDomainHasHotpluggableStartupVcpus(virDomainDef *def)
 }
 
 
+static int
+qemuProcessSetupDirtyLimit(virDomainObj *vm,
+                           virDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivate *priv = vm->privateData;
+    virDomainDef *def = vm->def;
+    int ret = -1;
+
+    /* Dirty limit capability is not present, skip the setup */
+    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VCPU_DIRTY_LIMIT))
+        return 0;
+
+    if (virDomainDefHasDirtyLimitStartupVcpus(def)) {
+        size_t maxvcpus = virDomainDefGetVcpusMax(def);
+        virDomainVcpuDef *vcpu;
+        size_t i;
+
+        if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+            return -1;
+
+        for (i = 0; i < maxvcpus; i++) {
+            vcpu = virDomainDefGetVcpu(def, i);
+
+            if (vcpu->dirtyLimitSet && (vcpu->dirty_limit != 0)) {
+                if ((ret = qemuMonitorSetVcpuDirtyLimit(priv->mon, i, vcpu->dirty_limit)) < 0) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR,
+                                   _("Failed to set dirty page rate limit of vcpu[%1$zu]"), i);
+                    qemuDomainObjExitMonitor(vm);
+                    return ret;
+                }
+                VIR_DEBUG("Set vcpu[%zu] dirty page rate limit %lld", i, vcpu->dirty_limit);
+            }
+        }
+        qemuDomainObjExitMonitor(vm);
+    }
+
+    return 0;
+}
+
+
 static int
 qemuProcessVcpusSortOrder(const void *a,
                           const void *b)
@@ -7833,6 +7873,10 @@ qemuProcessLaunch(virConnectPtr conn,
     if (qemuProcessUpdateAndVerifyCPU(vm, asyncJob) < 0)
         goto cleanup;
 
+    VIR_DEBUG("Setting Dirty Limit for virtual CPUs");
+    if (qemuProcessSetupDirtyLimit(vm, asyncJob) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Detecting IOThread PIDs");
     if (qemuProcessDetectIOThreadPIDs(vm, asyncJob) < 0)
         goto cleanup;
-- 
2.38.5





[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux