[libvirt] [PATCH v2 3/5] event: introduce new event for cputune

Pavel Hrdina phrdina at redhat.com
Mon Sep 15 12:54:10 UTC 2014


On 09/13/2014 12:12 AM, Eric Blake wrote:
> On 09/10/2014 06:08 AM, Pavel Hrdina wrote:
>> This new event will use typedParameters to expose what has been actually
>> updated and the reason is that we can in the future extend the cputune.
>> With typedParameters we don't have to worry about creating some sort of
>> v2 of cputune event if there will be new features implemented for cputune.
>
> Nice - about time we planned for future extension in one of our events :)
>
>>
>> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
>> ---
>
>> +++ b/daemon/remote.c
>> @@ -111,6 +111,13 @@ remoteDeserializeTypedParameters(remote_typed_param *args_params_val,
>>                                    int *nparams);
>>
>>   static int
>> +remoteSerializeTypedParameters(virTypedParameterPtr params,
>> +                               int nparams,
>> +                               remote_typed_param **ret_params_val,
>> +                               u_int *ret_params_len,
>> +                               unsigned int flags);
>> +
>
> Hmm, is this static pre-declaration needed merely because the function
> occurs after the new point at which you will be using it?  I'm a big fan
> of topological sorting, and avoiding static declarations for
> non-recursive functions (they are necessary for mutually-recursive
> functions, but this is not a case of that).  If you'd like, a separate
> patch that just does code motion to hoist the helper function to occur
> earlier than any clients would be worthwhile - but not a showstopper for
> this patch.  (If we do end up with a later patch series to reshuffle
> things into topological order, it is more than just this function
> impacted - and it's ideal to do such a reshuffle as a series where each
> patch is easy to review, rather than trying to reshuffle lots of
> functions at once).

I've done the same thing as for remoteDeserializeTypedParamters. It 
wouldn't be only this one function so I'd rather leave it for separate 
patch series.

>
>> +++ b/include/libvirt/libvirt.h.in
>> @@ -5153,6 +5153,24 @@ typedef void (*virConnectDomainEventDeviceRemovedCallback)(virConnectPtr conn,
>>                                                              const char *devAlias,
>>                                                              void *opaque);
>>
>> +/**
>> + * virConnectDomainEventCputuneCallback:
>> + * @conn: connection object
>> + * @dom: domain on which the event occurred
>> + * @params: changed cpupin values stored as array of virTypedParameter
>> + * @nparams: size of the array
>> + * @opaque: application specified data
>> + *
>> + * This callback occurs when cpu tune is updated.
>
> Are the expected typed parameter names, and expected associated types,
> documented anywhere?  For many virTypedParameter functions, we have
> macros giving the expected string name and doc comments for the
> corresponding type; for the new bulk stats API, the expected names are
> not constant but we are still doing a good job of documenting typical
> name patterns and expected types.  Looking ahead, I see patch 5 adds at
> least one call to virTypedParamsAddULLong("shares") - but the only place
> I see "shares" mentioned in libvirt.h.in is VIR_DOMAIN_SCHEDULER_SHARES,
> documented as an int rather than unsigned long long.  See my dilemma?
>

No, there isn't documentation for all events and I would definitely 
document what could be stored in the typed parameters but in a patch
series for documentation for all events.

Using the macros would be fine except for vcpupin information as the 
name is "vcpu%d".

>> + *
>> + * The callback signature to use when registering for an event of type
>> + * VIR_DOMAIN_EVENT_ID_CPUTUNE with virConnectDomainEventRegisterAny()
>> + */
>> +typedef void (*virConnectDomainEventCputuneCallback)(virConnectPtr conn,
>> +                                                     virDomainPtr dom,
>> +                                                     virTypedParameterPtr params,
>> +                                                     int nparams,
>> +                                                     void *opaque);
>
> This looks good.
>
>> +static virObjectEventPtr
>> +virDomainEventCputuneNew(int id,
>> +                         const char *name,
>> +                         unsigned char *uuid,
>> +                         virTypedParameterPtr params,
>> +                         int nparams)
>> +{
>> +    virDomainEventCputunePtr ev;
>> +
>> +    if (virDomainEventsInitialize() < 0)
>> +        return NULL;
>> +
>> +    if (!(ev = virDomainEventNew(virDomainEventCputuneClass,
>> +                                 VIR_DOMAIN_EVENT_ID_CPUTUNE,
>> +                                 id, name, uuid)))
>> +        return NULL;
>> +
>> +    ev->params = params;
>> +    ev->nparams = nparams;
>> +
>
> Awkward transfer semantics; caller must not free params after this
> function succeeds.  But you don't consume params on error.  Looking
> ahead at patch 5, I see a memory leak if this function fails, where the
> caller qemuDomainPinVcpuFlags does:
>
> +        event = virDomainEventCputuneNewFromDom(dom, eventParams,
> eventNparams);
>
> but fails to free eventParams if event was NULL (and because of the
> transfer semantics, it must NOT free eventParams if event is non-NULL).
>   I suppose I can live with transfer semantics (faster than deep-cloning
> the params) - but you probably ought to document that it is intentional,
> and for ease-of-use, I'd consider always freeing params here, even when
> returning NULL.
>
> Everything else looks okay.  So I'm just worried about documentation and
> the potential for memory leaks on OOM.
>

Thanks for catching this bug, will fix it that the function will consume 
the params.

Pavel




More information about the libvir-list mailing list