[libvirt] [PATCH 05/12] Support hypervisorpin xml parse.
Hu Tao
hutao at cn.fujitsu.com
Fri Jul 27 05:22:27 UTC 2012
On Wed, Jul 25, 2012 at 01:24:00PM +0800, tangchen wrote:
> From: Tang Chen <tangchen at cn.fujitsu.com>
>
> This patch adds a new xml element <hypervisorpin cpuset='1'>,
> and also the parser functions, docs, and tests.
> hypervisorpin means pinning hypervisor threads, and cpuset = '1'
> means pinning all hypervisor threads to cpu 1.
>
> Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
> docs/schemas/domaincommon.rng | 7 ++
> src/conf/domain_conf.c | 97 ++++++++++++++++++++++-
> src/conf/domain_conf.h | 1 +
> tests/qemuxml2argvdata/qemuxml2argv-cputune.xml | 1 +
> 4 files changed, 103 insertions(+), 3 deletions(-)
>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index b7562ad..57a576a 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -576,6 +576,13 @@
> </attribute>
> </element>
> </zeroOrMore>
> + <optional>
> + <element name="hypervisorpin">
> + <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 c53722a..bedbf79 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -7826,6 +7826,51 @@ error:
> goto cleanup;
> }
>
> +/* Parse the XML definition for hypervisorpin */
> +static virDomainVcpuPinDefPtr
> +virDomainHypervisorPinDefParseXML(const xmlNodePtr node)
> +{
> + virDomainVcpuPinDefPtr def = NULL;
> + char *tmp = NULL;
> +
> + if (VIR_ALLOC(def) < 0) {
> + virReportOOMError();
> + return NULL;
> + }
> +
> + def->vcpuid = -1;
> +
> + tmp = virXMLPropString(node, "cpuset");
> +
> + if (tmp) {
> + char *set = tmp;
> + int cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
> +
> + if (VIR_ALLOC_N(def->cpumask, cpumasklen) < 0) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + if (virDomainCpuSetParse(set, 0, def->cpumask,
> + cpumasklen) < 0)
> + goto error;
> +
> + VIR_FREE(tmp);
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + "%s", _("missing cpuset for hypervisor pin"));
> + goto error;
> + }
> +
> +cleanup:
> + return def;
> +
> +error:
> + VIR_FREE(tmp);
> + VIR_FREE(def);
> + goto cleanup;
> +}
> +
> static int virDomainDefMaybeAddController(virDomainDefPtr def,
> int type,
> int idx)
> @@ -8219,6 +8264,34 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> }
> VIR_FREE(nodes);
>
> + if ((n = virXPathNodeSet("./cputune/hypervisorpin", ctxt, &nodes)) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("cannot extract hypervisorpin nodes"));
> + goto error;
> + }
> +
> + if (n > 1) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("only one hypervisorpin is supported"));
> + VIR_FREE(nodes);
> + goto error;
> + }
> +
> + if (n && VIR_ALLOC(def->cputune.hypervisorpin) < 0) {
> + goto no_memory;
> + }
> +
> + if (n) {
> + virDomainVcpuPinDefPtr hypervisorpin = NULL;
> + hypervisorpin = virDomainHypervisorPinDefParseXML(nodes[0]);
> +
> + if (!hypervisorpin)
> + goto error;
> +
> + def->cputune.hypervisorpin = hypervisorpin;
> + }
> + VIR_FREE(nodes);
> +
> /* Extract numatune if exists. */
> if ((n = virXPathNodeSet("./numatune", ctxt, &nodes)) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -9226,7 +9299,7 @@ no_memory:
> virReportOOMError();
> /* fallthrough */
>
> - error:
> +error:
> VIR_FREE(tmp);
> VIR_FREE(nodes);
> virBitmapFree(bootMap);
> @@ -12794,7 +12867,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.hypervisorpin)
> virBufferAddLit(buf, " <cputune>\n");
>
> if (def->cputune.shares)
> @@ -12826,8 +12900,25 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> }
> }
>
> + if (def->cputune.hypervisorpin) {
> + virBufferAsprintf(buf, " <hypervisorpin ");
> +
> + char *cpumask = NULL;
> + cpumask = virDomainCpuSetFormat(def->cputune.hypervisorpin->cpumask,
> + VIR_DOMAIN_CPUMASK_LEN);
> + if (cpumask == NULL) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + "%s", _("failed to format cpuset for hypervisor"));
> + 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.hypervisorpin)
> virBufferAddLit(buf, " </cputune>\n");
>
> if (def->numatune.memory.nodemask ||
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 469d3b6..11f0eb0 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1607,6 +1607,7 @@ struct _virDomainDef {
> long long quota;
> int nvcpupin;
> virDomainVcpuPinDefPtr *vcpupin;
> + virDomainVcpuPinDefPtr hypervisorpin;
> } cputune;
>
> virDomainNumatuneDef numatune;
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
> index df3101d..b72af1b 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'/>
> + <hypervisorpin cpuset='1'/>
> </cputune>
> <os>
> <type arch='i686' machine='pc'>hvm</type>
> --
> 1.7.10.2
ACK.
--
Thanks,
Hu Tao
More information about the libvir-list
mailing list