[libvirt] [PATCH v2.1 09/21] Support emulatorpin xml parse.

Daniel Veillard veillard at redhat.com
Wed Aug 22 07:52:25 UTC 2012


On Tue, Aug 21, 2012 at 05:18:32PM +0800, Hu Tao wrote:
> From: Tang Chen <tangchen at cn.fujitsu.com>
> 
> This patch adds a new xml element <emulatorpin>, which is a sibling
> to the existing <vcpupin> element under the <cputune>, to pin emulator
> threads to specified physical CPUs.
> 
> Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
>  docs/formatdomain.html.in                       |    9 ++++
>  docs/schemas/domaincommon.rng                   |    7 ++++
>  src/conf/domain_conf.c                          |   50 ++++++++++++++++++++++-
>  src/conf/domain_conf.h                          |    1 +
>  tests/qemuxml2argvdata/qemuxml2argv-cputune.xml |    1 +
>  5 files changed, 66 insertions(+), 2 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 8e07489..81ec2cd 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -384,6 +384,7 @@
>      <vcpupin vcpu="1" cpuset="0,1"/>
>      <vcpupin vcpu="2" cpuset="2,3"/>
>      <vcpupin vcpu="3" cpuset="0,4"/>
> +    <emulatorpin cpuset="1-3"/%gt;
>      <shares>2048</shares>
>      <period>1000000</period>
>      <quota>-1</quota>
> @@ -410,6 +411,14 @@
>          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 ommitted, "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.
> +       </dd>
>        <dt><code>shares</code></dt>
>        <dd>
>          The optional <code>shares</code> element specifies the proportional
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 401b76b..b02ad96 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -591,6 +591,13 @@
>                </attribute>
>              </element>
>            </zeroOrMore>
> +          <optional>
> +            <element name="emulatorpin">
> +              <attribute name="cpuset">
> +                <ref name="cpuset"/>
> +              </attribute>
> +            </element>
> +          </optional>
>          </element>
>        </optional>
>  
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 62ba9de..94ec095 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -8330,6 +8330,34 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>      }
>      VIR_FREE(nodes);
>  
> +    if ((n = virXPathNodeSet("./cputune/emulatorpin", ctxt, &nodes)) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("cannot extract emulatorpin nodes"));
> +        goto error;
> +    }
> +
> +    if (n) {
> +        if (n > 1) {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                           _("only one emulatorpin is supported"));
> +            VIR_FREE(nodes);
> +            goto error;
> +        }
> +
> +        if (VIR_ALLOC(def->cputune.emulatorpin) < 0) {
> +            goto no_memory;
> +        }
> +
> +        virDomainVcpuPinDefPtr emulatorpin = NULL;
> +        emulatorpin = virDomainVcpuPinDefParseXML(nodes[0], ctxt, 0);
> +
> +        if (!emulatorpin)
> +            goto error;
> +
> +        def->cputune.emulatorpin = emulatorpin;
> +    }
> +    VIR_FREE(nodes);
> +
>      /* Extract numatune if exists. */
>      if ((n = virXPathNodeSet("./numatune", ctxt, &nodes)) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -12930,7 +12958,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>      virBufferAsprintf(buf, ">%u</vcpu>\n", def->maxvcpus);
>  
>      if (def->cputune.shares || def->cputune.vcpupin ||
> -        def->cputune.period || def->cputune.quota)
> +        def->cputune.period || def->cputune.quota ||
> +        def->cputune.emulatorpin)
>          virBufferAddLit(buf, "  <cputune>\n");
>  
>      if (def->cputune.shares)
> @@ -12962,8 +12991,25 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>          }
>      }
>  
> +    if (def->cputune.emulatorpin) {
> +        virBufferAsprintf(buf, "    <emulatorpin ");
> +
> +        char *cpumask = NULL;
> +        cpumask = virDomainCpuSetFormat(def->cputune.emulatorpin->cpumask,
> +                                        VIR_DOMAIN_CPUMASK_LEN);
> +        if (cpumask == NULL) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           "%s", _("failed to format cpuset for emulator"));
> +                goto cleanup;
> +        }
> +
> +        virBufferAsprintf(buf, "cpuset='%s'/>\n", cpumask);
> +        VIR_FREE(cpumask);
> +    }
> +
>      if (def->cputune.shares || def->cputune.vcpupin ||
> -        def->cputune.period || def->cputune.quota)
> +        def->cputune.period || def->cputune.quota ||
> +        def->cputune.emulatorpin)
>          virBufferAddLit(buf, "  </cputune>\n");
>  
>      if (def->numatune.memory.nodemask ||
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 025c7fe..a7b2ff6 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1600,6 +1600,7 @@ struct _virDomainDef {
>          long long quota;
>          int nvcpupin;
>          virDomainVcpuPinDefPtr *vcpupin;
> +        virDomainVcpuPinDefPtr emulatorpin;
>      } cputune;
>  
>      virDomainNumatuneDef numatune;
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
> index df3101d..593e650 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
> @@ -10,6 +10,7 @@
>      <quota>-1</quota>
>      <vcpupin vcpu='0' cpuset='0'/>
>      <vcpupin vcpu='1' cpuset='1'/>
> +    <emulatorpin cpuset='1'/>
>    </cputune>
>    <os>
>      <type arch='i686' machine='pc'>hvm</type>

  ACK, but it needed the following fixup to cope with the fix for patch 8

Daniel

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 59f22ac..304ab88 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8396,7 +8396,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         }
 
         virDomainVcpuPinDefPtr emulatorpin = NULL;
-        emulatorpin = virDomainVcpuPinDefParseXML(nodes[0], ctxt, 0);
+        emulatorpin = virDomainVcpuPinDefParseXML(nodes[0], ctxt,
+                                                  def->maxvcpus, 1);
 
         if (!emulatorpin)
             goto error;

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list