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

Michal Privoznik mprivozn at redhat.com
Mon May 27 15:26:51 UTC 2019


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?

Also, I'm not sure @vals is going to be allocated at all times, will it?

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

Michal




More information about the libvir-list mailing list