On 09/23/2014 02:47 PM, Pavel Hrdina wrote: > Now we have universal tunable event so we can use it for reporting > changes to user. The cputune values will be prefixed with "cputune" to > distinguish it from other tunable events. > > Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> > --- > > since v4: > - added macro definitions for cputune typedParameters fileds > > include/libvirt/libvirt.h.in | 63 ++++++++++++++++++++++++++++++++++ > src/qemu/qemu_cgroup.c | 19 ++++++++++- > src/qemu/qemu_driver.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 162 insertions(+), 1 deletion(-) > > diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in > index 86be86f..898f8b5 100644 > --- a/include/libvirt/libvirt.h.in > +++ b/include/libvirt/libvirt.h.in > @@ -5204,6 +5204,66 @@ typedef void (*virConnectDomainEventDeviceRemovedCallback)(virConnectPtr conn, > void *opaque); > > /** > + * VIR_DOMAIN_EVENT_CPUTUNE_VCPUPIN: > + * > + * Macro represents formatted pinning for one vcpu specified by id which is > + * appended to the parameter name, for example "cputune.vcpupin1", > + * as VIR_TYPED_PARAM_STRING. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_VCPUPIN "cputune.vcpupin%u" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_EMULATORIN: > + * > + * Macro represents formatted pinning for emulator process, > + * as VIR_TYPED_PARAM_STRING. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATORIN "cputune.emulatorpin" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES: > + * > + * Macro represents proportional weight of the scheduler used on the > + * host cpu, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES "cputune.cpu_shares" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_VCPU_PERIOD: > + * > + * Macro represents the enforcement period for a quota, in microseconds, > + * for vcpus only, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_VCPU_PERIOD "cputune.vcpu_period" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_VCPU_QUOTA: > + * > + * Macro represents the maximum bandwidth to be used within a period for > + * vcpus only, when using the posix scheduler, as VIR_TYPED_PARAM_LLONG. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_VCPU_QUOTA "cputune.vcpu_quota" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_PERIOD: > + * > + * Macro represents the enforcement period for a quota in microseconds, > + * when using the posix scheduler, for all emulator activity not tied to > + * vcpus, as VIR_TYPED_PARAM_ULLONG. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_PERIOD "cputune.emulator_period" > + > +/** > + * VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_QUOTA: > + * > + * Macro represents the maximum bandwidth to be used within a period for > + * all emulator activity not tied to vcpus, when using the posix scheduler, > + * as an VIR_TYPED_PARAM_LLONG. > + */ > +#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_QUOTA "cputune.emulator_quota" > + > + > +/** > * virConnectDomainEventTunableCallback: > * @conn: connection object > * @dom: domain on which the event occurred > @@ -5215,6 +5275,9 @@ typedef void (*virConnectDomainEventDeviceRemovedCallback)(virConnectPtr conn, > * be freed in the callback handler as it's done internally after the callback > * handler is executed. > * > + * Currently supported name spaces: > + * "cputune.*" > + * > * The callback signature to use when registering for an event of type > * VIR_DOMAIN_EVENT_ID_TUNABLE with virConnectDomainEventRegisterAny() > */ > diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c > index 7c6b2c1..41d7057 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 = 0; s/0/NULL/ ACK w/ that. John > + int eventNparams = 0; > + int eventMaxparams = 0; > > if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) { > if (vm->def->cputune.sharesSpecified) { > @@ -694,7 +699,19 @@ 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, > + VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES, > + val) < 0) > + return -1; > + > + event = virDomainEventTunableNewFromObj(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 e73d4f9..d1a0657 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -4538,6 +4538,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); > @@ -4645,6 +4651,18 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, > > if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) > goto cleanup; > + > + if (snprintf(paramField, VIR_TYPED_PARAM_FIELD_LENGTH, > + VIR_DOMAIN_EVENT_CPUTUNE_VCPUPIN, vcpu) < 0) { > + goto cleanup; > + } > + > + str = virBitmapFormat(pcpumap); > + if (virTypedParamsAddString(&eventParams, &eventNparams, > + &eventMaxparams, paramField, str) < 0) > + goto cleanup; > + > + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams); > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > @@ -4680,6 +4698,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); > @@ -4804,6 +4825,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); > @@ -4909,6 +4936,15 @@ qemuDomainPinEmulator(virDomainPtr dom, > > if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) > goto cleanup; > + > + str = virBitmapFormat(pcpumap); > + if (virTypedParamsAddString(&eventParams, &eventNparams, > + &eventMaxparams, > + VIR_DOMAIN_EVENT_CPUTUNE_EMULATORIN, > + str) < 0) > + goto cleanup; > + > + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams); > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > @@ -4938,6 +4974,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) > @@ -9202,6 +9241,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); > @@ -9272,6 +9315,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > > vm->def->cputune.shares = val; > vm->def->cputune.sharesSpecified = true; > + > + if (virTypedParamsAddULLong(&eventParams, &eventNparams, > + &eventMaxNparams, > + VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES, > + val) < 0) > + goto cleanup; > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > @@ -9289,6 +9338,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > goto cleanup; > > vm->def->cputune.period = value_ul; > + > + if (virTypedParamsAddULLong(&eventParams, &eventNparams, > + &eventMaxNparams, > + VIR_DOMAIN_EVENT_CPUTUNE_VCPU_PERIOD, > + value_ul) < 0) > + goto cleanup; > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) > @@ -9303,6 +9358,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > goto cleanup; > > vm->def->cputune.quota = value_l; > + > + if (virTypedParamsAddLLong(&eventParams, &eventNparams, > + &eventMaxNparams, > + VIR_DOMAIN_EVENT_CPUTUNE_VCPU_QUOTA, > + value_l) < 0) > + goto cleanup; > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) > @@ -9318,6 +9379,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > goto cleanup; > > vm->def->cputune.emulator_period = value_ul; > + > + if (virTypedParamsAddULLong(&eventParams, &eventNparams, > + &eventMaxNparams, > + VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_PERIOD, > + value_ul) < 0) > + goto cleanup; > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) > @@ -9333,6 +9400,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > goto cleanup; > > vm->def->cputune.emulator_quota = value_l; > + > + if (virTypedParamsAddLLong(&eventParams, &eventNparams, > + &eventMaxNparams, > + VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_QUOTA, > + value_l) < 0) > + goto cleanup; > } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) > @@ -9343,6 +9416,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) > goto cleanup; > > + if (eventNparams) { > + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams); > + eventNparams = 0; > + if (event) > + qemuDomainEventQueue(driver, event); > + } > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > rc = virDomainSaveConfig(cfg->configDir, vmdef); > @@ -9359,6 +9438,8 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, > virDomainDefFree(vmdef); > if (vm) > virObjectUnlock(vm); > + if (eventNparams) > + virTypedParamsFree(eventParams, eventNparams); > virObjectUnref(caps); > virObjectUnref(cfg); > return ret; > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list