]> xenbits.xensource.com Git - libvirt.git/commitdiff
virDomain{Get,Set}PerfEvents: Grab job
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 31 Mar 2016 05:21:11 +0000 (07:21 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 31 Mar 2016 08:48:41 +0000 (10:48 +0200)
Even though we have the machine locked throughout whole APIs we
are querying/modifying domain internal state. We should grab a
job whilst doing that.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_driver.c

index c80f1dae363e4be5b0d0e2cbdf8cae1c9b639e88..4aa162590fd8064eaff8ae261ed65fedf3fad63e 100644 (file)
@@ -10071,9 +10071,12 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
     if (virDomainSetPerfEventsEnsureACL(dom->conn, vm->def) < 0)
         goto cleanup;
 
-    if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
+    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
         goto cleanup;
 
+    if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
+        goto endjob;
+
     if (def) {
         for (i = 0; i < nparams; i++) {
             virTypedParameterPtr param = &params[i];
@@ -10081,16 +10084,16 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
             type = virPerfEventTypeFromString(param->field);
 
             if (!enabled && virPerfEventDisable(priv->perf, type))
-                goto cleanup;
+                goto endjob;
             if (enabled && virPerfEventEnable(priv->perf, type, vm->pid))
-                goto cleanup;
+                goto endjob;
 
             def->perf->events[type] = enabled ?
                 VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO;
         }
 
         if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
-            goto cleanup;
+            goto endjob;
     }
 
     if (persistentDef) {
@@ -10104,11 +10107,14 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
         }
 
         if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0)
-            goto cleanup;
+            goto endjob;
     }
 
     ret = 0;
 
+ endjob:
+    qemuDomainObjEndJob(driver, vm);
+
  cleanup:
     virDomainObjEndAPI(&vm);
     virObjectUnref(cfg);
@@ -10121,6 +10127,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
                         int *nparams,
                         unsigned int flags)
 {
+    virQEMUDriverPtr driver = dom->conn->privateData;
     virDomainObjPtr vm = NULL;
     qemuDomainObjPrivatePtr priv;
     virDomainDefPtr def;
@@ -10140,9 +10147,12 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
     if (virDomainGetPerfEventsEnsureACL(dom->conn, vm->def) < 0)
         goto cleanup;
 
-    if (!(def = virDomainObjGetOneDef(vm, flags)))
+    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
         goto cleanup;
 
+    if (!(def = virDomainObjGetOneDef(vm, flags)))
+        goto endjob;
+
     priv = vm->privateData;
 
     for (i = 0; i < VIR_PERF_EVENT_LAST; i++) {
@@ -10156,7 +10166,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
         if (virTypedParamsAddBoolean(&par, &npar, &maxpar,
                                      virPerfEventTypeToString(i),
                                      perf_enabled) < 0)
-            goto cleanup;
+            goto endjob;
     }
 
     *params = par;
@@ -10165,6 +10175,9 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
     npar = 0;
     ret = 0;
 
+ endjob:
+    qemuDomainObjEndJob(driver, vm);
+
  cleanup:
     virDomainObjEndAPI(&vm);
     virTypedParamsFree(par, npar);