[libvirt] [PATCH] Fix virCgroupGetPercpuStats with non-continuous present CPUs

Michal Privoznik mprivozn at redhat.com
Thu Jan 22 14:21:54 UTC 2015


On 22.01.2015 12:26, Ján Tomko wrote:
> Per-cpu stats are only shown for present CPUs in the cgroups,
> but we were only parsing the largest CPU number from
> /sys/devices/system/cpu/present and looking for stats even for
> non-present CPUs.
> This resulted in:
> internal error: cpuacct parse error
> ---
>  cfg.mk                |  2 +-
>  src/nodeinfo.c        | 17 +++++++++++++++++
>  src/nodeinfo.h        |  1 +
>  src/util/vircgroup.c  | 24 ++++++++++++++++++------
>  tests/vircgroupmock.c | 44 ++++++++++++++++++++++++++++++++++++++------
>  tests/vircgrouptest.c | 47 +++++++++++++++++++++++++++++++++++------------
>  6 files changed, 110 insertions(+), 25 deletions(-)
> 
> diff --git a/cfg.mk b/cfg.mk
> index 21f83c3..70612f8 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -1095,7 +1095,7 @@ exclude_file_name_regexp--sc_prohibit_asprintf = \
>    ^(bootstrap.conf$$|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
>  
>  exclude_file_name_regexp--sc_prohibit_strdup = \
> -  ^(docs/|examples/|src/util/virstring\.c|tests/virnetserverclientmock.c$$)
> +  ^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c$$)
>  
>  exclude_file_name_regexp--sc_prohibit_close = \
>    (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir(cgroup|pci)mock\.c)$$)
> diff --git a/src/nodeinfo.c b/src/nodeinfo.c
> index 3c22ebc..3a27c22 100644
> --- a/src/nodeinfo.c
> +++ b/src/nodeinfo.c
> @@ -1242,6 +1242,23 @@ nodeGetCPUCount(void)
>  }
>  
>  virBitmapPtr
> +nodeGetPresentCPUBitmap(void)
> +{
> +    int max_present;
> +
> +    if ((max_present = nodeGetCPUCount()) < 0)
> +        return NULL;
> +
> +#ifdef __linux__
> +    if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/present"))
> +        return linuxParseCPUmap(max_present, SYSFS_SYSTEM_PATH "/cpu/present");
> +#endif
> +    virReportError(VIR_ERR_NO_SUPPORT, "%s",
> +                   _("non-continuous host cpu numbers not implemented on this platform"));
> +    return NULL;
> +}
> +
> +virBitmapPtr
>  nodeGetCPUBitmap(int *max_id ATTRIBUTE_UNUSED)
>  {

>From my understanding the nodeGetPresentCPUBitmap() is no different than
nodeGetCPUBitmap(). The latter can do everything that the former and
more. Can we just use already existing function then?

Otherwise looking good.

Michal




More information about the libvir-list mailing list