[libvirt] [PATCH 7/9] util: Refactor 'virResctrlMonitorStats'

Michal Privoznik mprivozn at redhat.com
Tue May 28 09:01:50 UTC 2019


On 5/28/19 10:32 AM, Huaqiang,Wang wrote:
> 
> 
> On 2019年05月27日 23:26, Michal Privoznik wrote:
>> On 5/23/19 11:34 AM, Wang Huaqiang wrote:
>>> Refactor 'virResctrlMonitorStats' to track multiple statistical
>>> records.
>>>
>>> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
>>> ---
>>>   src/qemu/qemu_driver.c |  2 +-
>>>   src/util/virresctrl.c  | 17 ++++++++++++++---
>>>   src/util/virresctrl.h  | 12 ++++++++++--
>>>   3 files changed, 25 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>> index 2abed86..4ea346c 100644
>>> --- a/src/qemu/qemu_driver.c
>>> +++ b/src/qemu/qemu_driver.c
>>> @@ -20120,7 +20120,7 @@ qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
>>>                        "cpu.cache.monitor.%zu.bank.%zu.bytes", i, j);
>>>               if (virTypedParamsAddUInt(&record->params, 
>>> &record->nparams,
>>>                                         maxparams, param_name,
>>> - resdata[i]->stats[j]->val) < 0)
>>> + resdata[i]->stats[j]->vals[0]) < 0)
>>
>> So why undergo the whole torture of 8/9 and 9/9 if we will report one 
>> value only?
> 
> 
> The changes of patch7 and 8 give the code the capability for pass more 
> than one @vals
> from util/resctrl to qemu. This will be used in later MBM patches, at 
> that time, @vals[0]
> and @vals[1] will be used for passing the 'local memory bandwidth' and 
> 'total memory
> bandwidth'.
> 

Yes, I kind of expected that. But the explanation was missing.

> If change not make, then we have to add some other function
> like 'qemuDomainGetStatsCpuCache' but for memory bandwidth make the call 
> twice,
> it is very inefficient.

I'm not opposed this change, it's just that there was no justification 
for this change.

> 
>>
>> Also, I'm not sure @vals is going to be allocated at all times, will it?
>>
> 
> Yes. @vals should never be NULL for code in qemu_driver.c, and it is 
> allocated by
> util/resctrl.
> 
>>>                   goto cleanup;
>>>           }
>>>       }
>>> diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
>>> index 0f18d2b..c2fe2ed 100644
>>> --- a/src/util/virresctrl.c
>>> +++ b/src/util/virresctrl.c
>>> @@ -2686,6 +2686,7 @@ virResctrlMonitorGetStats(virResctrlMonitorPtr 
>>> monitor,
>>>   {
>>>       int rv = -1;
>>>       int ret = -1;
>>> +    unsigned int val = 0;
>>>       DIR *dirp = NULL;
>>>       char *datapath = NULL;
>>>       char *filepath = NULL;
>>> @@ -2742,7 +2743,7 @@ virResctrlMonitorGetStats(virResctrlMonitorPtr 
>>> monitor,
>>>           if (virStrToLong_uip(node_id, NULL, 0, &stat->id) < 0)
>>>               goto cleanup;
>>>   -        rv = virFileReadValueUint(&stat->val, "%s/%s/%s", datapath,
>>> +        rv = virFileReadValueUint(&val, "%s/%s/%s", datapath,
>>>                                     ent->d_name, resource);
>>>           if (rv == -2) {
>>>               virReportError(VIR_ERR_INTERNAL_ERROR,
>>> @@ -2752,6 +2753,12 @@ virResctrlMonitorGetStats(virResctrlMonitorPtr 
>>> monitor,
>>>           if (rv < 0)
>>>               goto cleanup;
>>>   +        if (VIR_APPEND_ELEMENT(stat->vals, stat->nvals, val) < 0)
>>> +            goto cleanup;
>>> +
>>> +        if (virStringListAdd(&stat->features, resource) < 0)
>>> +            goto cleanup;
>>> +
>>>           if (VIR_APPEND_ELEMENT(*stats, *nstats, stat) < 0)
>>>               goto cleanup;
>>>       }
>>> @@ -2779,8 +2786,12 @@ 
>>> virResctrlMonitorFreeStats(virResctrlMonitorStatsPtr *stats,
>>>       if (!stats)
>>>           return;
>>>   -    for (i = 0; i < nstats; i++)
>>> -        VIR_FREE(stats[i]);
>>> +    for (i = 0; i < nstats; i++) {
>>> +        if (stats[i]) {
>>> +            VIR_FREE(stats[i]->vals);
>>> +            virStringListFree(stats[i]->features);
>>> +        }
>>> +    }
>>>   }
>>>     diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h
>>> index abdeb59..97205bc 100644
>>> --- a/src/util/virresctrl.h
>>> +++ b/src/util/virresctrl.h
>>> @@ -194,8 +194,16 @@ typedef virResctrlMonitor *virResctrlMonitorPtr;
>>>   typedef struct _virResctrlMonitorStats virResctrlMonitorStats;
>>>   typedef virResctrlMonitorStats *virResctrlMonitorStatsPtr;
>>>   struct _virResctrlMonitorStats {
>>> -    unsigned int id;
>>> -    unsigned int val;
>>> +    /* The system assigned cache ID associated with statistical 
>>> record */
>>> +     unsigned int id;
>>> +    /* @features is a NULL terminal string list tracking the 
>>> statistical record
>>> +     * name.*/
>>> +    char **features;
>>> +    /* @vals store the statistical record values and @val[0] is the 
>>> value for
>>> +     * @features[0], @val[1] for at features[1] ... respectively */
>>> +    unsigned int *vals;
>>> +    /* The length of @vals array */
>>> +    size_t nvals;
>>
>> We like the following style more:
>>
>> struct X {
>>   int memberA;  /* some description of this member
>>                    split into two lines */
>>   bool memberB; /* one line description */
>> };
>>
>> But on the other hand, this is consistent with the rest of resctrl 
>> code. Your call which style to use.
>>
> 
> Yes. That's my think for why using this kind of coding style. If you 
> permit, I'd like to using
> the current comment coding style, it looks consistent with virresctrl.c 
> and virresctrl.h files.

Fine by me.

Michal




More information about the libvir-list mailing list