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

Pavel Hrdina phrdina at redhat.com
Tue Sep 23 20:07:49 UTC 2014


On 09/23/2014 09:37 PM, John Ferlan wrote:
>
>
> 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.

And again thanks, pushed.

Pavel

>
> 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