[libvirt] [PATCH] nodeinfo: Get the correct CPU number on AMD Magny Cours platform

Stefan Berger stefanb at linux.vnet.ibm.com
Mon May 14 12:01:37 UTC 2012


On 05/14/2012 04:25 AM, Osier Yang wrote:
> "Instead of developing one CPU with 12 cores, the Magny Cours is
> actually two 6 core “Bulldozer” CPUs combined in to one package"
>
> I.e, each package has two NUMA nodes, and the two numa nodes share
> the same core ID set (0-6), which means parsing the cores number
> from sysfs doesn't work in this case.
>
> And the wrong CPU number could cause three problems for libvirt:
>
> 1) performance lost
>
>    A domain without "cpuset" or "placement='auto'" (to drive numad)
> specified will be only pinned to part of the CPUs.
>
> 2) domain can be started
>
>    If a domain uses numad, and the advisory nodeset returned from
> numad contains node which exceeds the range of wrong total CPU
> number. The domain will fail to start, as the bitmask passed to
> sched_setaffinity could be fully filled with zero.
>
> 3) wrong CPU number affects lots of stuffs.
>
>    E.g. for command "virsh vcpuinfo", "virsh vcpupin", it will always
> output with the truncated CPU list.
>
> For more details:
>
> https://www.redhat.com/archives/libvir-list/2012-May/msg00607.html
>
> This patch is to fix the problem by parsing /proc/cpuinfo to get
> the value of field "cpu cores", and use it as nodeinfo->cores if
> it's greater than the cores number from sysfs.
>
> @@ -265,6 +266,22 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
>                   &&  (*p == '\0' || *p == '.' || c_isspace(*p)))
>                   nodeinfo->mhz = ui;
>           }
> +
> +        if (STRPREFIX(buf, "cpu cores")) {
> +            char *p;
> +            unsigned int ui;
> +            buf += 9;

Nit: empty line after var. declaration.

> +            while (*buf&&  c_isspace(*buf))
> +                buf++;
> +            if (*buf != ':' || !buf[1]) {
> +                nodeReportError(VIR_ERR_INTERNAL_ERROR,
> +                                "%s", _("parsing cpuinfo cpu MHz"));
> +                return -1;
> +            }

This should probably say _("parsing number of CPU cores")

    Stefan




More information about the libvir-list mailing list