[libvirt] [PATCH v2 2/2] virsh: report only filled values in 'nodecpustats'

Ján Tomko jtomko at redhat.com
Tue Jan 28 14:15:07 UTC 2014


On 01/19/2014 06:55 PM, Roman Bogorodskiy wrote:
> A set of fields for CPU stats could vary on different platforms,
> for example, FreeBSD doesn't report 'iowait'.
> 
> Make virsh print out only the fields that were actually filled.

> ---
>  tools/virsh-host.c | 118 ++++++++++++++++++++++++++++++++---------------------
>  1 file changed, 71 insertions(+), 47 deletions(-)
> 
> diff --git a/tools/virsh-host.c b/tools/virsh-host.c
> index ac41177..8c1218e 100644
> --- a/tools/virsh-host.c
> +++ b/tools/virsh-host.c
> @@ -34,6 +34,7 @@
>  #include "internal.h"
>  #include "virbuffer.h"
>  #include "viralloc.h"
> +#include "virhash.h"
>  #include "virsh-domain.h"
>  #include "virxml.h"
>  #include "virtypedparam.h"
> @@ -335,23 +336,15 @@ static const vshCmdOptDef opts_node_cpustats[] = {
>  static bool
>  cmdNodeCpuStats(vshControl *ctl, const vshCmd *cmd)
>  {
> -    size_t i, j;
> +    size_t i, j, k;
>      bool flag_utilization = false;
>      bool flag_percent = vshCommandOptBool(cmd, "percent");
>      int cpuNum = VIR_NODE_CPU_STATS_ALL_CPUS;
>      virNodeCPUStatsPtr params;
>      int nparams = 0;
>      bool ret = false;
> -    struct cpu_stats {
> -        unsigned long long user;
> -        unsigned long long sys;
> -        unsigned long long idle;
> -        unsigned long long iowait;
> -        unsigned long long intr;
> -        unsigned long long util;
> -    } cpu_stats[2];
> -    double user_time, sys_time, idle_time, iowait_time, intr_time, total_time;
> -    double usage;
> +    const char *fields[] = {"user:", "system:", "idle:", "iowait:", "intr:", NULL};

Maybe creating an enum with VIR_ENUM_DECL/VIR_ENUM_IMPL would make the code
easier to read? (You could use the FromString/ToString functions and an array
of bools to tell missing/zero fields apart instead of NULL pointers)

> +    virHashTablePtr cpu_stats[2];

This should be initialized to NULLs.

>  
>      if (vshCommandOptInt(cmd, "cpu", &cpuNum) < 0) {
>          vshError(ctl, "%s", _("Invalid value of cpuNum"));
> @@ -372,6 +365,10 @@ cmdNodeCpuStats(vshControl *ctl, const vshCmd *cmd)
>      params = vshCalloc(ctl, nparams, sizeof(*params));
>  
>      for (i = 0; i < 2; i++) {
> +        cpu_stats[i] = virHashCreate(0, (virHashDataFree) free);
> +        if (cpu_stats[i] == NULL)
> +            goto cleanup;
> +
>          if (i > 0)
>              sleep(1);
>  
> @@ -381,20 +378,25 @@ cmdNodeCpuStats(vshControl *ctl, const vshCmd *cmd)
>          }
>  
>          for (j = 0; j < nparams; j++) {
> -            unsigned long long value = params[j].value;
> +            unsigned long long *value;
> +
> +            if (VIR_ALLOC(value) < 0)
> +                goto cleanup;
> +
> +            *value = params[j].value;
>  
>              if (STREQ(params[j].field, VIR_NODE_CPU_STATS_KERNEL)) {
> -                cpu_stats[i].sys = value;
> +                virHashAddEntry(cpu_stats[i], "system:", value);
>              } else if (STREQ(params[j].field, VIR_NODE_CPU_STATS_USER)) {
> -                cpu_stats[i].user = value;
> +                virHashAddEntry(cpu_stats[i], "user:", value);
>              } else if (STREQ(params[j].field, VIR_NODE_CPU_STATS_IDLE)) {
> -                cpu_stats[i].idle = value;
> +                virHashAddEntry(cpu_stats[i], "idle:", value);
>              } else if (STREQ(params[j].field, VIR_NODE_CPU_STATS_IOWAIT)) {
> -                cpu_stats[i].iowait = value;
> +                virHashAddEntry(cpu_stats[i], "iowait:", value);
>              } else if (STREQ(params[j].field, VIR_NODE_CPU_STATS_INTR)) {
> -                cpu_stats[i].intr = value;
> +                virHashAddEntry(cpu_stats[i], "intr:", value);
>              } else if (STREQ(params[j].field, VIR_NODE_CPU_STATS_UTILIZATION)) {

Hmm, did libvirtd ever fill out the 'usage' field? I can't find it in git history.

> -                cpu_stats[i].util = value;
> +                virHashAddEntry(cpu_stats[i], "usage:", value);
>                  flag_utilization = true;
>              }
>          }
> @@ -405,46 +407,68 @@ cmdNodeCpuStats(vshControl *ctl, const vshCmd *cmd)


> +            virHashTablePtr diff;
This should be declared at the start of the function, so you can free it in
the cleanup label.

> +            double total_time = 0;
> +            double usage = -1;
> +
> +            diff = virHashCreate(0, (virHashDataFree) free);
> +            if (diff == NULL)
> +                goto cleanup;
> +
> +            for (k = 0; fields[k] != NULL; k++) {
> +                double *value_diff;
> +                unsigned long long *oldval = virHashLookup(cpu_stats[0], fields[k]);
> +                unsigned long long *newval = virHashLookup(cpu_stats[1], fields[k]);
> +


Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140128/68437a22/attachment-0001.sig>


More information about the libvir-list mailing list