[libvirt] [PATCH v2 5/5] cputune_event: queue the event for cputune updates

Pavel Hrdina phrdina at redhat.com
Wed Sep 10 12:08:24 UTC 2014


Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 src/qemu/qemu_cgroup.c | 18 ++++++++++++-
 src/qemu/qemu_driver.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 43d14d4..43b5340 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -34,6 +34,7 @@
 #include "virscsi.h"
 #include "virstring.h"
 #include "virfile.h"
+#include "virtypedparam.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -676,6 +677,10 @@ static int
 qemuSetupCpuCgroup(virDomainObjPtr vm)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
+    virObjectEventPtr event = NULL;
+    virTypedParameterPtr eventParams;
+    int eventNparams = 0;
+    int eventMaxparams = 0;
 
     if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
        if (vm->def->cputune.sharesSpecified) {
@@ -694,7 +699,18 @@ qemuSetupCpuCgroup(virDomainObjPtr vm)
 
         if (virCgroupGetCpuShares(priv->cgroup, &val) < 0)
             return -1;
-        vm->def->cputune.shares = val;
+        if (vm->def->cputune.shares != val) {
+            vm->def->cputune.shares = val;
+            if (virTypedParamsAddULLong(&eventParams, &eventNparams,
+                                        &eventMaxparams, "shares",
+                                        val) < 0)
+                return -1;
+
+            event = virDomainEventCputuneNewFromObj(vm, eventParams, eventNparams);
+        }
+
+        if (event)
+            qemuDomainEventQueue(vm->privateData, event);
     }
 
     return 0;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a8cda43..2389e32 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4462,6 +4462,12 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     virBitmapPtr pcpumap = NULL;
     virQEMUDriverConfigPtr cfg = NULL;
     virCapsPtr caps = NULL;
+    virObjectEventPtr event = NULL;
+    char paramField[VIR_TYPED_PARAM_FIELD_LENGTH] = "";
+    char *str = NULL;
+    virTypedParameterPtr eventParams = NULL;
+    int eventNparams = 0;
+    int eventMaxparams = 0;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -4569,6 +4575,18 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
 
         if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
             goto cleanup;
+
+        if (virSnprintf(paramField, "vcpu%d", vcpu) < 0) {
+            goto cleanup;
+        }
+
+        str = virBitmapFormat(pcpumap);
+        if (virTypedParamsAddString(&eventParams, &eventNparams,
+                                    &eventMaxparams, paramField, str) < 0) {
+            goto cleanup;
+        }
+
+        event = virDomainEventCputuneNewFromDom(dom, eventParams, eventNparams);
     }
 
     if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
@@ -4604,6 +4622,9 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
         virCgroupFree(&cgroup_vcpu);
     if (vm)
         virObjectUnlock(vm);
+    if (event)
+        qemuDomainEventQueue(driver, event);
+    VIR_FREE(str);
     virBitmapFree(pcpumap);
     virObjectUnref(caps);
     virObjectUnref(cfg);
@@ -4728,6 +4749,12 @@ qemuDomainPinEmulator(virDomainPtr dom,
     virBitmapPtr pcpumap = NULL;
     virQEMUDriverConfigPtr cfg = NULL;
     virCapsPtr caps = NULL;
+    virObjectEventPtr event = NULL;
+    char * str = NULL;
+    virTypedParameterPtr eventParams = NULL;
+    int eventNparams = 0;
+    int eventMaxparams = 0;
+
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -4833,6 +4860,14 @@ qemuDomainPinEmulator(virDomainPtr dom,
 
         if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
             goto cleanup;
+
+        str = virBitmapFormat(pcpumap);
+        if (virTypedParamsAddString(&eventParams, &eventNparams,
+                                    &eventMaxparams, "emulatorpin", str) < 0) {
+            goto cleanup;
+        }
+
+        event = virDomainEventCputuneNewFromDom(dom, eventParams, eventNparams);
     }
 
     if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
@@ -4862,6 +4897,9 @@ qemuDomainPinEmulator(virDomainPtr dom,
  cleanup:
     if (cgroup_emulator)
         virCgroupFree(&cgroup_emulator);
+    if (event)
+        qemuDomainEventQueue(driver, event);
+    VIR_FREE(str);
     virBitmapFree(pcpumap);
     virObjectUnref(caps);
     if (vm)
@@ -9054,6 +9092,10 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
     virQEMUDriverConfigPtr cfg = NULL;
     virCapsPtr caps = NULL;
     qemuDomainObjPrivatePtr priv;
+    virObjectEventPtr event = NULL;
+    virTypedParameterPtr eventParams = NULL;
+    int eventNparams = 0;
+    int eventMaxNparams = 0;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -9124,6 +9166,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
 
                 vm->def->cputune.shares = val;
                 vm->def->cputune.sharesSpecified = true;
+
+                if (virTypedParamsAddULLong(&eventParams, &eventNparams,
+                                            &eventMaxNparams, "shares",
+                                            val) < 0)
+                    goto cleanup;
             }
 
             if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
@@ -9141,6 +9188,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
                     goto cleanup;
 
                 vm->def->cputune.period = value_ul;
+
+                if (virTypedParamsAddULLong(&eventParams, &eventNparams,
+                                            &eventMaxNparams, "period",
+                                            value_ul) < 0)
+                    goto cleanup;
             }
 
             if (flags & VIR_DOMAIN_AFFECT_CONFIG)
@@ -9155,6 +9207,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
                     goto cleanup;
 
                 vm->def->cputune.quota = value_l;
+
+                if (virTypedParamsAddLLong(&eventParams, &eventNparams,
+                                           &eventMaxNparams, "quota",
+                                           value_l) < 0)
+                    goto cleanup;
             }
 
             if (flags & VIR_DOMAIN_AFFECT_CONFIG)
@@ -9170,6 +9227,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
                     goto cleanup;
 
                 vm->def->cputune.emulator_period = value_ul;
+
+                if (virTypedParamsAddULLong(&eventParams, &eventNparams,
+                                            &eventMaxNparams, "emulator_period",
+                                            value_ul) < 0)
+                    goto cleanup;
             }
 
             if (flags & VIR_DOMAIN_AFFECT_CONFIG)
@@ -9185,6 +9247,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
                     goto cleanup;
 
                 vm->def->cputune.emulator_quota = value_l;
+
+                if (virTypedParamsAddLLong(&eventParams, &eventNparams,
+                                           &eventMaxNparams, "emulator_quota",
+                                           value_l) < 0)
+                    goto cleanup;
             }
 
             if (flags & VIR_DOMAIN_AFFECT_CONFIG)
@@ -9205,12 +9272,18 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
         vmdef = NULL;
     }
 
+
     ret = 0;
 
  cleanup:
     virDomainDefFree(vmdef);
     if (vm)
         virObjectUnlock(vm);
+    if (eventNparams) {
+        event = virDomainEventCputuneNewFromDom(dom, eventParams, eventNparams);
+        if (event)
+            qemuDomainEventQueue(driver, event);
+    }
     virObjectUnref(caps);
     virObjectUnref(cfg);
     return ret;
-- 
1.8.5.5




More information about the libvir-list mailing list