virPerfEventType type;
bool enabled;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+ VIR_DOMAIN_AFFECT_CONFIG, -1);
- if (virTypedParamsValidate(params, nparams, VIR_PERF_PARAMETERS) < 0)
+ if (virTypedParamsValidate(params, nparams,
+ VIR_PERF_PARAM_CMT, VIR_TYPED_PARAM_BOOLEAN,
+ NULL) < 0)
return -1;
if (!(vm = qemuDomObjFromDomain(dom)))
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
goto cleanup;
- for (i = 0; i < nparams; i++) {
- virTypedParameterPtr param = ¶ms[i];
- enabled = params->value.b;
- type = virPerfEventTypeFromString(param->field);
+ if (def) {
+ for (i = 0; i < nparams; i++) {
+ virTypedParameterPtr param = ¶ms[i];
+ enabled = params->value.b;
+ type = virPerfEventTypeFromString(param->field);
- if (!enabled && virPerfEventDisable(priv->perf, type))
- goto cleanup;
- if (enabled && virPerfEventEnable(priv->perf, type, vm->pid))
- goto cleanup;
+ if (!enabled && virPerfEventDisable(priv->perf, type))
+ goto cleanup;
+ if (enabled && virPerfEventEnable(priv->perf, type, vm->pid))
+ goto cleanup;
- if (def) {
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;
}
- if (persistentDef) {
+ if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
+ goto cleanup;
+ }
+
+ if (persistentDef) {
+ for (i = 0; i < nparams; i++) {
+ virTypedParameterPtr param = ¶ms[i];
+ enabled = params->value.b;
+ type = virPerfEventTypeFromString(param->field);
+
persistentDef->perf->events[type] = enabled ?
VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO;
-
- if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0)
- goto cleanup;
}
+
+ if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0)
+ goto cleanup;
}
ret = 0;
int *nparams,
unsigned int flags)
{
- size_t i;
virDomainObjPtr vm = NULL;
qemuDomainObjPrivatePtr priv;
- int ret = -1;
+ virDomainDefPtr def;
virTypedParameterPtr par = NULL;
int maxpar = 0;
int npar = 0;
+ size_t i;
+ int ret = -1;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+ VIR_DOMAIN_AFFECT_CONFIG |
+ VIR_TYPED_PARAM_STRING_OKAY, -1);
if (!(vm = qemuDomObjFromDomain(dom)))
goto cleanup;
- priv = vm->privateData;
-
if (virDomainGetPerfEventsEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
+ if (!(def = virDomainObjGetOneDef(vm, flags)))
+ goto cleanup;
+
+ priv = vm->privateData;
+
for (i = 0; i < VIR_PERF_EVENT_LAST; i++) {
+ bool perf_enabled;
+
+ if (flags & VIR_DOMAIN_AFFECT_CONFIG)
+ perf_enabled = def->perf->events[i] == VIR_TRISTATE_BOOL_YES;
+ else
+ perf_enabled = virPerfEventIsEnabled(priv->perf, i);
+
if (virTypedParamsAddBoolean(&par, &npar, &maxpar,
virPerfEventTypeToString(i),
- virPerfEventIsEnabled(priv->perf, i)) < 0) {
- virTypedParamsFree(par, npar);
+ perf_enabled) < 0)
goto cleanup;
- }
}
*params = par;
*nparams = npar;
+ par = NULL;
+ npar = 0;
ret = 0;
cleanup:
virDomainObjEndAPI(&vm);
+ virTypedParamsFree(par, npar);
return ret;
}
.type = VSH_OT_STRING,
.help = N_("perf events which will be disabled")
},
+ VIRSH_COMMON_OPT_DOMAIN_CONFIG,
+ VIRSH_COMMON_OPT_DOMAIN_LIVE,
+ VIRSH_COMMON_OPT_DOMAIN_CURRENT,
{.name = NULL}
};
bool ret = false;
const char *enable = NULL, *disable = NULL;
unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
+ bool current = vshCommandOptBool(cmd, "current");
+ bool config = vshCommandOptBool(cmd, "config");
+ bool live = vshCommandOptBool(cmd, "live");
+
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
+
+ if (config)
+ flags |= VIR_DOMAIN_AFFECT_CONFIG;
+ if (live)
+ flags |= VIR_DOMAIN_AFFECT_LIVE;
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
return false;
=item B<perf> I<domain> [I<--enable> B<eventSpec>]
[I<--disable> B<eventSpec>]
+[[I<--config>] [I<--live>] | [I<--current>]]
Get the current perf events setting or enable/disable specific perf
events for a guest domain.
PQos (Platform Qos) feature to monitor the usage of cache by applications
running on the platform.
+If I<--live> is specified, affect a running guest.
+If I<--config> is specified, affect the next boot of a persistent guest.
+If I<--current> is specified, affect the current guest state.
+Both I<--live> and I<--config> flags may be given, but I<--current> is
+exclusive. If no flag is specified, behavior is different depending
+on hypervisor.
+
=item B<blkiotune> I<domain> [I<--weight> B<weight>]
[I<--device-weights> B<device-weights>]
[I<--device-read-iops-sec> B<device-read-iops-sec>]