[libvirt] [PATCH v4 4/4] cputune_event: queue the event for cputune updates
John Ferlan
jferlan at redhat.com
Mon Sep 22 15:54:34 UTC 2014
On 09/18/2014 04:39 AM, 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 at redhat.com>
> ---
> src/qemu/qemu_cgroup.c | 18 +++++++++++-
> src/qemu/qemu_driver.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 93 insertions(+), 1 deletion(-)
>
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index 9d39370..27dcba3 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;
Consistency with other defs "eventParams = NULL".
> + 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, "cputune.shares",
Perhaps this name space ('cputune.*') should be what goes into libvirt.h
(mentioned in the v2 3/5 review).
That is define and use
#define VIR_DOMAIN_EVENT_CPUTUNE_SHARES "cputune.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 5fd89a3..22c6e55 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,
> + "cputune.vcpupin%d", vcpu) < 0) {
#define VIR_DOMAIN_EVENT_CPUTUNE_VCPUPIN "cputune.vcpupin%u"
BTW: vcpu is an unsigned... Somehow have to comment that the event will
*start with* this string with the postfix being the vCPU number as
defined by the guest.
> + 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,13 @@ qemuDomainPinEmulator(virDomainPtr dom,
>
> if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
> goto cleanup;
> +
> + str = virBitmapFormat(pcpumap);
> + if (virTypedParamsAddString(&eventParams, &eventNparams,
> + &eventMaxparams, "cputune.emulatorpin", str) < 0)
#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATORPIN "cputune.emulatorpin"
> + goto cleanup;
> +
> + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams);
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> @@ -4938,6 +4972,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)
> @@ -9096,6 +9133,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);
> @@ -9166,6 +9207,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
>
> vm->def->cputune.shares = val;
> vm->def->cputune.sharesSpecified = true;
> +
> + if (virTypedParamsAddULLong(&eventParams, &eventNparams,
> + &eventMaxNparams, "cputune.shares",
VIR_DOMAIN_EVENT_CPUTUNE_SHARES
> + val) < 0)
> + goto cleanup;
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> @@ -9183,6 +9229,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> goto cleanup;
>
> vm->def->cputune.period = value_ul;
> +
> + if (virTypedParamsAddULLong(&eventParams, &eventNparams,
> + &eventMaxNparams, "cputune.period",
#define VIR_DOMAIN_EVENT_CPUTUNE_VCPU_PERIOD "cputune.vcpu_period"
> + value_ul) < 0)
> + goto cleanup;
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> @@ -9197,6 +9248,11 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> goto cleanup;
>
> vm->def->cputune.quota = value_l;
> +
> + if (virTypedParamsAddLLong(&eventParams, &eventNparams,
> + &eventMaxNparams, "cputune.quota",
#define VIR_DOMAIN_EVENT_CPUTUNE_VCPU_QUOTA "cputune.vcpu_quota"
> + value_l) < 0)
> + goto cleanup;
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> @@ -9212,6 +9268,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> goto cleanup;
>
> vm->def->cputune.emulator_period = value_ul;
> +
> + if (virTypedParamsAddULLong(&eventParams, &eventNparams,
> + &eventMaxNparams,
> + "cputune.emulator_period",
#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_PERIOD "cputune.emulator_period"
> + value_ul) < 0)
> + goto cleanup;
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> @@ -9227,6 +9289,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> goto cleanup;
>
> vm->def->cputune.emulator_quota = value_l;
> +
> + if (virTypedParamsAddLLong(&eventParams, &eventNparams,
> + &eventMaxNparams,
> + "cputune.emulator_quota",
#define VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_QUOTA "cputune.emulator_quota"
> + value_l) < 0)
> + goto cleanup;
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> @@ -9237,6 +9305,12 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
> goto cleanup;
>
> + if (eventNparams) {
> + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams);
FWIW: This is the code that got me to thinking in 2/4 about the usage of
eventMaxNparams vs. just eventNparams. They I believe are the same, but
can we "foresee" any reason they could/would differ.
In any case, I think with the usage of libvirt.h #define's this is ACK-able.
John
> + eventNparams = 0;
> + if (event)
> + qemuDomainEventQueue(driver, event);
> + }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> rc = virDomainSaveConfig(cfg->configDir, vmdef);
> @@ -9253,6 +9327,8 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom,
> virDomainDefFree(vmdef);
> if (vm)
> virObjectUnlock(vm);
> + if (eventNparams)
> + virTypedParamsFree(eventParams, eventNparams);
> virObjectUnref(caps);
> virObjectUnref(cfg);
> return ret;
>
More information about the libvir-list
mailing list