[libvirt] [PATCH] RFC: Clarify the relationship between <vcpu>, <vcpupin>, and <emulatorpin>

Hu Tao hutao at cn.fujitsu.com
Mon Oct 15 06:22:57 UTC 2012


On Fri, Oct 12, 2012 at 01:27:27PM +0800, Osier Yang wrote:
> These 3 elements conflicts with each other in either the doc
> or the underlying codes are. This is to propse a solution.
> 
> Before writing any codes, I want to see if the principle is
> correct, any advise is welcomed.
> 
> Current problems:
> 
> Problem 1:
> 
> The doc shouldn't simply say "These settings are superseded
> by CPU tuning. " for element <vcpu>. As except the tuning, <vcpu>
> allows to specify the current, maxmum vcpu number. Apart from that,
> <vcpu> also allows to specify the placement as "auto", which binds
> the domain process to the advisory nodeset from numad.
> 
> Problem 2:
> 
> Doc for <vcpu> says its "cpuset" specify the physical CPUs
> that the vcpus can be pinned. But it's not the truth, as
> actually it only pin domain process to the specified physical
> CPUs. So either it's a document bug, or code bug.
> 
> Problem 3:
> 
> Doc for <vcpupin> says it supersed "cpuset" of <vcpu>, it's
> not quite correct, as each <vcpupin> specify the pinning policy
> only for one vcpu. How about the ones which doesn't have
> <vcpupin> specified? it says the vcpu will be pinned to all
> available physical CPUs, but what's the meaning of attribute
> "cpuset" of <vcpu> then?
> 
> Problem 4:
> 
> Doc for <emulatorpin> says it pin the emulator threads (domain
> process in other context, perhaps another follow up patch to
> cleanup the inconsistency is needed) to the physical CPUs
> specified its attribute "cpuset". Which conflicts with
> <vcpu>'s "cpuset". And actually in the underlying codes,
> it set the affinity for domain process twice if both
> "cpuset" for <vcpu> and <emulatorpin> are specified,
> and <emulatorpin>'s pinning will override <vcpu>'s.
> 
> Problem 5:
> 
> When "placement" of <vcpu> is "auto" (I.e. uses numad to
> get the advisory nodeset to which the domain process is
> pinned to), it will also be overridden by <emulatorpin>,
> 
> This patch is trying to sort out the conflicts or bugs by:
> 
> 1) Don't say <vcpu> is superseded by <cputune>

You mean in the documentation of XML format?

Acutally the VCPUs placement settings of <vcpu> will be overrided 
by those of <cputune>. So I think it's better to keep the words in
doc to make users aware of this.

> 
> 2) Keep the semanteme for "cpuset" of <vcpu> (I.e. Still says it
>    specify the physical CPUs the virtual CPUs). But modifying it
>    to mention it also set the pinning policy for domain process,
>    and the CPU placement of domain process specified by "cpuset"
>    of <vcpu> will be ingored if <emulatorpin> specified, and
>    similary, the CPU placement of vcpu thread will be ignored
>    if it has <vcpupin> specified, for vcpu which doesn't have
>    <vcpupin> specified, it inherits "cpuset" of <vcpu>.

OK.

> 
> 3) Don't say <vcpu> is supersed by <vcpupin>. If neither <vcpupin>
>    nor "cpuset" of <vcpu> is specified, the vcpu will be pinned
>    to all available pCPUs.

OK.

> 
> 4) If neither <emulatorpin> nor "cpuset" of <vcpu> is specified,
>    the domain process (emulator threads in the context) will be
>    pinned to all available pCPUs.

OK.

> 
> 5) If "placement" of <vcpu> is "auto", <emulatorpin> is not allowed.

Conflicts with 2). Why not just override the emulator part? for vcpu
threads the "placement" is still "auto".

> 
> 6) hotplugged vcpus will also inherit "cpuset" of <vcpu>

OK.

> 
> Codes changes above document changes will cause:
> 
> 1) Inherit def->cpumask for each vcpu which doesn't have <vcpupin>
>    specified, during parsing.

OK.

> 
> 2) ping the vcpu which doesn't have <vcpupin> specified to def->cpumask

s/ping/pin/

>    either by cgroup for sched_setaffinity(2), which is actually done
>    by 1).

pin vcpu according to this_vcpu->cpumask, since the cpumask either
inherits from def->cpumask(<vcpu>), or is set by <vcpupin>.

> 
> 3) Error out if "placement" == "auto", and <emulatorpin> is specified.
>    Otherwise, <emulatorpin> is honored, and "cpuset" of <cpuset> is
>    ignored.

You mean "cpuset" of <vcpu> here?

But I still don't understand why "placement" = "auto" and <emulatorpin>
can not both exist, but the latter overides the former.

> 
> 4) Setup cgroup for each hotplugged vcpu, and setup the pinning policy
>    by either cgroup or sched_setaffinity(2).

OK.

> 
> 5) Remove cgroup and <vcpupin> for each hot unplugged vcpu.
> ---
>  docs/formatdomain.html.in |   42 +++++++++++++++++++++++++++---------------
>  1 files changed, 27 insertions(+), 15 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index d664e7e..1ae8cf4 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -357,8 +357,18 @@
>          the maximum supported by the hypervisor.  <span class="since">Since
>          0.4.4</span>, this element can contain an optional
>          <code>cpuset</code> attribute, which is a comma-separated
> -        list of physical CPU numbers that virtual CPUs can be pinned
> -        to.  Each element in that list is either a single CPU number,
> +        list of physical CPU numbers that domain process and virtual CPUs
> +        can be pinned to by default. (NB: The pinning policy of domain
> +        process and virtual CPUs can be specified separately by
> +        <code>cputune</code>. If attribute <code>emulatorpin</code>
> +        of <code>cputune</code> is specified, <code>cpuset</code>
> +        specified by <code>vcpu</code> here will be ingored; Similarly,
> +        For virtual CPUs which has <code>vcpupin</code> specified,
> +        <code>cpuset</code> specified by <code>cpuset</code> here
> +        will be ignored; For virtual CPUs which doesn't have
> +        <code>vcpupin</code> specified, it will be pinned to the physical
> +        CPUs specified by <code>cpuset</code> here).
> +        Each element in that list is either a single CPU number,
>          a range of CPU numbers, or a caret followed by a CPU number to
>          be excluded from a previous range.  <span class="since">Since
>          0.8.5</span>, the optional attribute <code>current</code> can
> @@ -374,8 +384,7 @@
>          if it's specified. If both <code>cpuset</code> and <code>placement</code>
>          are not specified, or if <code>placement</code> is "static", but no
>          <code>cpuset</code> is specified, the domain process will be pinned to
> -        all the available physical CPUs. These settings are superseded
> -        by <a href="#elementsCPUTuning">CPU tuning</a>.
> +        all the available physical CPUs.
>        </dd>
>      </dl>
>  
> @@ -411,23 +420,26 @@
>        <dt><code>vcpupin</code></dt>
>        <dd>
>          The optional <code>vcpupin</code> element specifies which of host's
> -        physical CPUs the domain VCPU will be pinned to. This setting supersedes
> -        previous VCPU placement specified in <a href="#elementsCPUAllocation">CPU
> -        Allocation</a> using <code>vcpu</code> element. If this is omitted,
> -        each VCPU is pinned to all the physical CPUs by default. It contains two
> -        required attributes, the attribute <code>vcpu</code> specifies vcpu id,
> -        and the attribute <code>cpuset</code> is same as
> -        attribute <code>cpuset</code>
> -        of element <code>vcpu</code>. (NB: Only qemu driver support)
> +        physical CPUs the domain VCPU will be pinned to. If this is omitted,
> +        and attribute <code>cpuset</code> of element <code>vcpu</code> is
> +        not specified, the vCPU is pinned to all the physical CPUs by default.
> +        It contains two required attributes, the attribute <code>vcpu</code>
> +        specifies vcpu id, and the attribute <code>cpuset</code> is same as
> +        attribute <code>cpuset</code> of element <code>vcpu</code>.
> +        (NB: Only qemu driver support)
>          <span class="since">Since 0.9.0</span>
>         </dd>
>         <dt><code>emulatorpin</code></dt>
>         <dd>
>           The optional <code>emulatorpin</code> element specifies which of host
>           physical CPUs the "emulator", a subset of a domain not including vcpu,
> -         will be pinned to. If this is omitted, "emulator" is pinned to all
> -         the physical CPUs by default. It contains one required attribute
> -         <code>cpuset</code> specifying which physical CPUs to pin to.
> +         will be pinned to. If this is omitted, and attribute
> +         <code>cpuset</code> of element <code>vcpu</code> is not specified,
> +         "emulator" is pinned to all the physical CPUs by default. It contains
> +         one required attribute <code>cpuset</code> specifying which physical
> +         CPUs to pin to. NB, <code>emulatorpin</code> is not allowed if
> +         attribute <code>placement</code> of element <code>vcpu</code> is
> +         "auto".
>         </dd>
>        <dt><code>shares</code></dt>
>        <dd>
> -- 
> 1.7.7.6
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
Thanks,
Hu Tao




More information about the libvir-list mailing list