[libvirt] [PATCH v5 4/4] cputune_event: queue the event for cputune updates

John Ferlan jferlan at redhat.com
Tue Sep 23 19:37:01 UTC 2014



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 at redhat.com>
> ---
> 
> 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;
> 




More information about the libvir-list mailing list