[libvirt] [PATCH 3/7] conf: Initialize the pinning policy for vcpus

Martin Kletzander mkletzan at redhat.com
Fri Oct 12 12:42:35 UTC 2012


On 10/12/2012 11:50 AM, Osier Yang wrote:
> Document for <vcpu>'s "cpuset" says:
> 
> Since 0.4.4, this element can contain an optional cpuset attribute,
> which is a comma-separated list of physical CPU numbers that virtual
> CPUs can be pinned to.
> 
> However, it's not the truth, libvirt actually pins the domain
> process to the specified pCPUs by "cpuset" of <vcpu>. And the
> vcpu thread are pinned to all available pCPUs if no <vcpupin>
> is specified for it.
> 
> PATCH 1/7 provides more details on how this set resolve the
> confused relationship between <vcpu> and <vcpupin>. This patch
> is to implement the codes to inherit <vcpu>'s "cpuset" for
> vcpu that doesn't have <vcpupin> specified, and <vcpupin>
> for these vcpu will be ignored when formating. Underlying
> driver implementation will make sure the vcpu thread pinned
> to correct pCPUs.
> ---
>  src/conf/domain_conf.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 70 insertions(+), 1 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index d8ea8ce..e404a68 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -8810,6 +8810,41 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>      }
>      VIR_FREE(nodes);
>  
> +    /* Initialize the pinning policy for vcpus which doesn't has
> +     * the policy specified explicitly as def->cpuset.
> +     */
> +    if (def->cpumask) {
> +        if (!def->cputune.vcpupin) {
> +            if (VIR_ALLOC_N(def->cputune.vcpupin, def->vcpus) < 0) {
> +                virReportOOMError();
> +                goto error;
> +            }
> +        } else {
> +            if (VIR_REALLOC_N(def->cputune.vcpupin, def->vcpus) < 0) {
> +                virReportOOMError();
> +                goto error;
> +            }
> +        }

You can always use VIR_REALLOC_N, as I mentioned with v1, no need for
the condition.

> +
> +        for (i = 0; i < def->vcpus; i++) {
> +            if (!virDomainVcpuPinIsDuplicate(def->cputune.vcpupin,
> +                                             def->cputune.nvcpupin,
> +                                             i)) {
> +                virDomainVcpuPinDefPtr vcpupin = NULL;
> +
> +                if (VIR_ALLOC(vcpupin) < 0) {
> +                    virReportOOMError();
> +                    goto error;
> +                }
> +
> +                vcpupin->cpumask = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN);
> +                virBitmapCopy(vcpupin->cpumask, def->cpumask);
> +                vcpupin->vcpuid = i;
> +                def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin;
> +            }
> +        }
> +    }
> +
>      if ((n = virXPathNodeSet("./cputune/emulatorpin", ctxt, &nodes)) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                         _("cannot extract emulatorpin nodes"));
[...]

Not exactly what I had in mind, but it fixes all the things I was
worried about, so ACK (with the REALLOC fixed).

Martin




More information about the libvir-list mailing list