提交 4349e24d 编写于 作者: M Michal Privoznik

virDomain{Get,Set}PerfEvents: Grab job

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: NMichal Privoznik <mprivozn@redhat.com>
上级 ed504ba3
...@@ -10071,9 +10071,12 @@ qemuDomainSetPerfEvents(virDomainPtr dom, ...@@ -10071,9 +10071,12 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
if (virDomainSetPerfEventsEnsureACL(dom->conn, vm->def) < 0) if (virDomainSetPerfEventsEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup; goto cleanup;
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
goto endjob;
if (def) { if (def) {
for (i = 0; i < nparams; i++) { for (i = 0; i < nparams; i++) {
virTypedParameterPtr param = &params[i]; virTypedParameterPtr param = &params[i];
...@@ -10081,16 +10084,16 @@ qemuDomainSetPerfEvents(virDomainPtr dom, ...@@ -10081,16 +10084,16 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
type = virPerfEventTypeFromString(param->field); type = virPerfEventTypeFromString(param->field);
if (!enabled && virPerfEventDisable(priv->perf, type)) if (!enabled && virPerfEventDisable(priv->perf, type))
goto cleanup; goto endjob;
if (enabled && virPerfEventEnable(priv->perf, type, vm->pid)) if (enabled && virPerfEventEnable(priv->perf, type, vm->pid))
goto cleanup; goto endjob;
def->perf->events[type] = enabled ? def->perf->events[type] = enabled ?
VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO; VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO;
} }
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
goto cleanup; goto endjob;
} }
if (persistentDef) { if (persistentDef) {
...@@ -10104,11 +10107,14 @@ qemuDomainSetPerfEvents(virDomainPtr dom, ...@@ -10104,11 +10107,14 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
} }
if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0)
goto cleanup; goto endjob;
} }
ret = 0; ret = 0;
endjob:
qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
virObjectUnref(cfg); virObjectUnref(cfg);
...@@ -10121,6 +10127,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom, ...@@ -10121,6 +10127,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
int *nparams, int *nparams,
unsigned int flags) unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virDomainDefPtr def; virDomainDefPtr def;
...@@ -10140,9 +10147,12 @@ qemuDomainGetPerfEvents(virDomainPtr dom, ...@@ -10140,9 +10147,12 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
if (virDomainGetPerfEventsEnsureACL(dom->conn, vm->def) < 0) if (virDomainGetPerfEventsEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
if (!(def = virDomainObjGetOneDef(vm, flags))) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
goto cleanup; goto cleanup;
if (!(def = virDomainObjGetOneDef(vm, flags)))
goto endjob;
priv = vm->privateData; priv = vm->privateData;
for (i = 0; i < VIR_PERF_EVENT_LAST; i++) { for (i = 0; i < VIR_PERF_EVENT_LAST; i++) {
...@@ -10156,7 +10166,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom, ...@@ -10156,7 +10166,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
if (virTypedParamsAddBoolean(&par, &npar, &maxpar, if (virTypedParamsAddBoolean(&par, &npar, &maxpar,
virPerfEventTypeToString(i), virPerfEventTypeToString(i),
perf_enabled) < 0) perf_enabled) < 0)
goto cleanup; goto endjob;
} }
*params = par; *params = par;
...@@ -10165,6 +10175,9 @@ qemuDomainGetPerfEvents(virDomainPtr dom, ...@@ -10165,6 +10175,9 @@ qemuDomainGetPerfEvents(virDomainPtr dom,
npar = 0; npar = 0;
ret = 0; ret = 0;
endjob:
qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
virTypedParamsFree(par, npar); virTypedParamsFree(par, npar);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册