From nobody Fri May 16 08:12:32 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zoho.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1498658311179912.1043277955505;
Wed, 28 Jun 2017 06:58:31 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
[10.5.11.12])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 871AC7C837;
Wed, 28 Jun 2017 13:58:26 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 4BFA4955A6;
Wed, 28 Jun 2017 13:58:26 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id EC5A71800C89;
Wed, 28 Jun 2017 13:58:25 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id v5SDvbW3024490 for ;
Wed, 28 Jun 2017 09:57:37 -0400
Received: by smtp.corp.redhat.com (Postfix)
id DCA4D5C460; Wed, 28 Jun 2017 13:57:37 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com
[10.5.110.39])
by smtp.corp.redhat.com (Postfix) with ESMTPS id D602286601
for ; Wed, 28 Jun 2017 13:57:36 +0000 (UTC)
Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 0C87F5AFED
for ; Wed, 28 Jun 2017 13:57:34 +0000 (UTC)
Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233])
by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with
ESMTP id v5SDvWdE010326
(version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
Wed, 28 Jun 2017 13:57:33 GMT
Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72])
by aserv0021.oracle.com (8.13.8/8.14.4) with ESMTP id v5SDvWrd014247
(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
Wed, 28 Jun 2017 13:57:32 GMT
Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14])
by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id v5SDvVCn002018;
Wed, 28 Jun 2017 13:57:32 GMT
Received: from nina.dynamic.ziggo.nl (/10.175.250.211)
by default (Oracle Beehive Gateway v4.0)
with ESMTP ; Wed, 28 Jun 2017 06:57:31 -0700
DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 871AC7C837
Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com;
dmarc=none (p=none dis=none) header.from=oracle.com
Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com;
spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com
DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 871AC7C837
DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0C87F5AFED
Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com;
dmarc=none (p=none dis=none) header.from=oracle.com
Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com;
spf=pass smtp.mailfrom=wim.ten.have@oracle.com
DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 0C87F5AFED
From: Wim Ten Have
To: Libvirt Development List
Date: Wed, 28 Jun 2017 15:56:36 +0200
Message-Id: <20170628135639.18785-2-wim.ten.have@oracle.com>
In-Reply-To: <20170628135639.18785-1-wim.ten.have@oracle.com>
References: <20170628135639.18785-1-wim.ten.have@oracle.com>
X-Source-IP: aserv0021.oracle.com [141.146.126.233]
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 203
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.39]); Wed, 28 Jun 2017 13:57:34 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.39]);
Wed, 28 Jun 2017 13:57:34 +0000 (UTC) for IP:'156.151.31.81'
DOMAIN:'userp1040.oracle.com' HELO:'userp1040.oracle.com'
FROM:'wim.ten.have@oracle.com' RCPT:''
X-RedHat-Spam-Score: -104.401 (BAYES_50, DCC_REPUT_13_19, RCVD_IN_DNSWL_MED,
RCVD_IN_MSPIKE_H2, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY,
USER_IN_WHITELIST) 156.151.31.81 userp1040.oracle.com 156.151.31.81
userp1040.oracle.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-loop: libvir-list@redhat.com
Cc: Wim ten Have
Subject: [libvirt] [RFC PATCH v2 1/4] numa: describe siblings distances
within cells
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]);
Wed, 28 Jun 2017 13:58:27 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
From: Wim ten Have
Add libvirtd NUMA cell domain administration functionality to
describe underlying cell id sibling distances in full fashion
when configuring HVM guests.
[below is an example of a 4 node setup]
|
|
|
|
Changes under this commit concern all those that require adding
the valid data structures, virDomainNuma* functional routines and the
XML doc schema enhancements to enforce appropriate administration.
These changes are accompanied with topic related documentation under
docs/formatdomain.html within the "CPU model and topology" extending the
"Guest NUMA topology" paragraph.
For terminology we refer to sockets as "nodes" where access to each
others' distinct resources such as memory make them "siblings" with a
designated "distance" between them. A specific design is described under
the ACPI (Advanced Configuration and Power Interface Specification)
within the chapter explaining the system's SLIT (System Locality Distance
Information Table).
These patches extend core libvirt's XML description of a virtual machine's
hardware to include NUMA distance information for sibling nodes, which
is then passed to Xen guests via libxl. Recently qemu landed support for
constructing the SLIT since commit 0f203430dd ("numa: Allow setting NUMA
distance for different NUMA nodes"), hence these core libvirt extensions
can also help other drivers in supporting this feature.
These changes alter the docs/schemas/cputypes.rng enforcing
domain administration to follow the syntax below per numa cell id.
These changes also alter docs/schemas/basictypes.rng to add
"numaDistanceValue" which is an "unsignedInt" with a minimum value
of 10 as 0-9 are reserved values and can not be used as System
Locality Distance Information Table data.
Signed-off-by: Wim ten Have
---
docs/formatdomain.html.in | 64 ++++++++++-
docs/schemas/basictypes.rng | 8 ++
docs/schemas/cputypes.rng | 18 +++
src/conf/cpu_conf.c | 2 +-
src/conf/numa_conf.c | 260 ++++++++++++++++++++++++++++++++++++++++=
+++-
src/conf/numa_conf.h | 25 ++++-
src/libvirt_private.syms | 6 +
7 files changed, 376 insertions(+), 7 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 36bea67..b9736e3 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1510,7 +1510,69 @@
=20
- This guest NUMA specification is currently available only for QEMU/K=
VM.
+ This guest NUMA specification is currently available only for
+ QEMU/KVM and Xen. Whereas Xen driver also allows for a distinct
+ description of NUMA arranged sibling
cell
+ distances
Since 3.6.0.
+
+
+
+ Under NUMA h/w architecture, distinct resources such as memory
+ create a designated distance between cell
and
+ siblings
that now can be described with the help of
+ distances
. A detailed describtion can be found within
+ the ACPI (Advanced Configuration and Power Interface Specification)
+ within the chapter explaining the system's SLIT (System Locality
+ Distance Information Table).
+
+
+
+...
+<cpu>
+ ...
+ <numa>
+ <cell id=3D'0' cpus=3D'0,4-7' memory=3D'512000' unit=3D'KiB'>
+ <distances>
+ <sibling id=3D'0' value=3D'10'/>
+ <sibling id=3D'1' value=3D'21'/>
+ <sibling id=3D'2' value=3D'31'/>
+ <sibling id=3D'3' value=3D'41'/>
+ </distances>
+ </cell>
+ <cell id=3D'1' cpus=3D'1,8-10,12-15' memory=3D'512000' unit=3D'KiB'=
memAccess=3D'shared'>
+ <distances>
+ <sibling id=3D'0' value=3D'21'/>
+ <sibling id=3D'1' value=3D'10'/>
+ <sibling id=3D'2' value=3D'21'/>
+ <sibling id=3D'3' value=3D'31'/>
+ </distances>
+ </cell>
+ <cell id=3D'2' cpus=3D'2,11' memory=3D'512000' unit=3D'KiB' memAcce=
ss=3D'shared'>
+ <distances>
+ <sibling id=3D'0' value=3D'31'/>
+ <sibling id=3D'1' value=3D'21'/>
+ <sibling id=3D'2' value=3D'10'/>
+ <sibling id=3D'3' value=3D'21'/>
+ </distances>
+ </cell>
+ <cell id=3D'3' cpus=3D'3' memory=3D'512000' unit=3D'KiB'>
+ <distances>
+ <sibling id=3D'0' value=3D'41'/>
+ <sibling id=3D'1' value=3D'31'/>
+ <sibling id=3D'2' value=3D'21'/>
+ <sibling id=3D'3' value=3D'10'/>
+ </distances>
+ </cell>
+ </numa>
+ ...
+</cpu>
+...
+
+
+ Under Xen driver, if no distances
are given to describe
+ the SLIT data between different cells, it will default to a scheme
+ using 10 for local and 21 for other cells. Which is the assumption
+ of guest OS when no SLIT is specified.
=20
diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng
index 1ea667c..a335b5d 100644
--- a/docs/schemas/basictypes.rng
+++ b/docs/schemas/basictypes.rng
@@ -77,6 +77,14 @@
=20
+
+
+
+ 10
+
+
+
+
diff --git a/docs/schemas/cputypes.rng b/docs/schemas/cputypes.rng
index 3eef16a..c45b6df 100644
--- a/docs/schemas/cputypes.rng
+++ b/docs/schemas/cputypes.rng
@@ -129,6 +129,24 @@
+
+
+
+ [
+ ]
+
+
+
+
+
+
+
+
+ [
+ ]
+
+ [
+ ]
=20
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index da40e9b..5d8f7be3 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -643,7 +643,7 @@ virCPUDefFormatBufFull(virBufferPtr buf,
if (virCPUDefFormatBuf(&childrenBuf, def, updateCPU) < 0)
goto cleanup;
=20
- if (virDomainNumaDefCPUFormat(&childrenBuf, numa) < 0)
+ if (virDomainNumaDefCPUFormatXML(&childrenBuf, numa) < 0)
goto cleanup;
=20
/* Put it all together */
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index bfd3703..1914810 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -48,6 +48,8 @@ VIR_ENUM_IMPL(virDomainMemoryAccess, VIR_DOMAIN_MEMORY_AC=
CESS_LAST,
"shared",
"private")
=20
+typedef struct _virDomainNumaDistance virDomainNumaDistance;
+typedef virDomainNumaDistance *virDomainNumaDistancePtr;
=20
typedef struct _virDomainNumaNode virDomainNumaNode;
typedef virDomainNumaNode *virDomainNumaNodePtr;
@@ -66,6 +68,12 @@ struct _virDomainNuma {
virBitmapPtr nodeset; /* host memory nodes where this guest node=
resides */
virDomainNumatuneMemMode mode; /* memory mode selection */
virDomainMemoryAccess memAccess; /* shared memory access configura=
tion */
+
+ struct _virDomainNumaDistance {
+ unsigned int value; /* locality value for node i*j */
+ unsigned int cellid;
+ } *distances; /* remote node distances */
+ size_t ndistances;
} *mem_nodes; /* guest node configuration */
size_t nmem_nodes;
=20
@@ -686,6 +694,95 @@ virDomainNumatuneNodesetIsAvailable(virDomainNumaPtr n=
umatune,
}
=20
=20
+static int
+virDomainNumaDefNodeDistanceParseXML(virDomainNumaPtr def,
+ xmlXPathContextPtr ctxt,
+ unsigned int cur_cell)
+{
+ int ret =3D -1;
+ char *tmp =3D NULL;
+ size_t i;
+ xmlNodePtr *nodes =3D NULL;
+ int ndistances;
+ virDomainNumaDistancePtr distances =3D NULL;
+
+
+ if (!virXPathNode("./distances[1]/sibling", ctxt))
+ return 0;
+
+ if ((ndistances =3D virXPathNodeSet("./distances[1]/sibling", ctxt, &n=
odes)) <=3D 0) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("NUMA distances defined without siblings"));
+ goto cleanup;
+ }
+
+ if (ndistances < def->nmem_nodes) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("NUMA distances defined with fewer siblings than =
nodes for cell id: '%d'"),
+ cur_cell);
+ goto cleanup;
+ }
+
+ if (VIR_ALLOC_N(distances, ndistances) < 0)
+ goto cleanup;
+
+ for (i =3D 0; i < ndistances; i++) {
+ unsigned int sibling_id =3D i, sibling_value;
+
+ /* siblings are in order of parsing or explicitly numbered */
+ if ((tmp =3D virXMLPropString(nodes[i], "id"))) {
+ if (virStrToLong_uip(tmp, NULL, 10, &sibling_id) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid 'id' attribute in NUMA distances=
for sibling: '%s'"),
+ tmp);
+ goto cleanup;
+ }
+
+ if (sibling_id >=3D ndistances) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Exactly one 'sibling' element per NUMA d=
istance "
+ "is allowed, non-contiguous ranges or ran=
ges not "
+ "starting from 0 are not allowed"));
+ goto cleanup;
+ }
+ }
+ VIR_FREE(tmp);
+
+ /* We need a locality value */
+ if (!(tmp =3D virXMLPropString(nodes[i], "value"))) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Missing 'value' attribute in NUMA distances =
for sibling id: '%d'"),
+ sibling_id);
+ goto cleanup;
+ }
+
+ /* It needs to be applicable */
+ if (virStrToLong_uip(tmp, NULL, 10, &sibling_value) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid 'value' attribute in NUMA distances =
for sibling id: '%d'"),
+ sibling_id);
+ goto cleanup;
+ }
+ VIR_FREE(tmp);
+
+ distances[sibling_id].cellid =3D sibling_id;
+ distances[sibling_id].value =3D sibling_value;
+ }
+
+ def->mem_nodes[cur_cell].distances =3D distances;
+ def->mem_nodes[cur_cell].ndistances =3D ndistances;
+
+ ret =3D 0;
+
+ cleanup:
+ if (ret)
+ VIR_FREE(distances);
+ VIR_FREE(nodes);
+ VIR_FREE(tmp);
+
+ return ret;
+}
+
int
virDomainNumaDefCPUParseXML(virDomainNumaPtr def,
xmlXPathContextPtr ctxt)
@@ -788,6 +885,14 @@ virDomainNumaDefCPUParseXML(virDomainNumaPtr def,
def->mem_nodes[cur_cell].memAccess =3D rc;
VIR_FREE(tmp);
}
+
+ /* Parse NUMA distances info */
+ if (virDomainNumaDefNodeDistanceParseXML(def, ctxt, cur_cell) < 0)=
{
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("NUMA cell %d has incorrect 'distances' config=
ured"),
+ cur_cell);
+ goto cleanup;
+ }
}
=20
ret =3D 0;
@@ -801,8 +906,8 @@ virDomainNumaDefCPUParseXML(virDomainNumaPtr def,
=20
=20
int
-virDomainNumaDefCPUFormat(virBufferPtr buf,
- virDomainNumaPtr def)
+virDomainNumaDefCPUFormatXML(virBufferPtr buf,
+ virDomainNumaPtr def)
{
virDomainMemoryAccess memAccess;
char *cpustr;
@@ -815,6 +920,8 @@ virDomainNumaDefCPUFormat(virBufferPtr buf,
virBufferAddLit(buf, "\n");
virBufferAdjustIndent(buf, 2);
for (i =3D 0; i < ncells; i++) {
+ int ndistances;
+
memAccess =3D virDomainNumaGetNodeMemoryAccessMode(def, i);
=20
if (!(cpustr =3D virBitmapFormat(virDomainNumaGetNodeCpumask(def, =
i))))
@@ -829,7 +936,30 @@ virDomainNumaDefCPUFormat(virBufferPtr buf,
if (memAccess)
virBufferAsprintf(buf, " memAccess=3D'%s'",
virDomainMemoryAccessTypeToString(memAccess)=
);
- virBufferAddLit(buf, "/>\n");
+
+ ndistances =3D def->mem_nodes[i].ndistances;
+ if (!ndistances) {
+ virBufferAddLit(buf, "/>\n");
+ } else {
+ size_t j;
+ virDomainNumaDistancePtr distances =3D def->mem_nodes[i].dista=
nces;
+
+ virBufferAddLit(buf, ">\n");
+ virBufferAdjustIndent(buf, 2);
+ virBufferAddLit(buf, "\n");
+ virBufferAdjustIndent(buf, 2);
+ for (j =3D 0; j < ndistances; j++) {
+ virBufferAddLit(buf, "\n");
+ }
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "\n");
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "\n");
+ }
+
VIR_FREE(cpustr);
}
virBufferAdjustIndent(buf, -2);
@@ -922,13 +1052,121 @@ virDomainNumaCheckABIStability(virDomainNumaPtr src,
size_t
virDomainNumaGetNodeCount(virDomainNumaPtr numa)
{
- if (!numa)
+ if (!numa || !numa->mem_nodes)
return 0;
=20
return numa->nmem_nodes;
}
=20
=20
+size_t
+virDomainNumaSetNodeCount(virDomainNumaPtr numa, size_t nmem_nodes)
+{
+ if (!numa || !nmem_nodes)
+ return 0;
+
+ if (numa->mem_nodes) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot alter an existing nmem_nodes set"));
+ return 0;
+ }
+
+ if (VIR_ALLOC_N(numa->mem_nodes, nmem_nodes) < 0)
+ return 0;
+
+ numa->nmem_nodes =3D nmem_nodes;
+
+ return numa->nmem_nodes;
+}
+
+
+size_t
+virDomainNumaGetNodeDistance(virDomainNumaPtr numa,
+ size_t node,
+ size_t cellid)
+{
+ virDomainNumaDistancePtr distances;
+
+ if (!numa)
+ return 0;
+
+ distances =3D numa->mem_nodes[node].distances;
+ if (!numa->mem_nodes[node].ndistances || !distances)
+ return 0;
+
+ return distances[cellid].value;
+}
+
+
+size_t
+virDomainNumaSetNodeDistance(virDomainNumaPtr numa,
+ size_t node,
+ size_t cellid,
+ unsigned int value)
+{
+ virDomainNumaDistancePtr distances;
+
+ /*
+ * Advanced Configuration and Power Interface
+ * Specification version 6.1. Chapter 5.2.17
+ * System Locality Distance Information Table
+ * ... Distance values of 0-9 are reserved.
+ */
+ if (!numa || value < 10)
+ return 0;
+
+ distances =3D numa->mem_nodes[node].distances;
+
+ if (numa->mem_nodes[node].ndistances > 0 &&
+ distances[cellid].value)
+ return 0;
+
+ distances[cellid].cellid =3D cellid;
+ distances[cellid].value =3D value;
+
+ return distances[cellid].value;
+}
+
+
+size_t
+virDomainNumaGetNodeDistanceCount(virDomainNumaPtr numa,
+ size_t node)
+{
+ if (!numa)
+ return 0;
+
+ return numa->mem_nodes[node].ndistances;
+}
+
+
+size_t
+virDomainNumaSetNodeDistanceCount(virDomainNumaPtr numa,
+ size_t node,
+ size_t ndistances)
+{
+ virDomainNumaDistancePtr distances;
+
+ if (!numa || !ndistances)
+ return 0;
+
+ distances =3D numa->mem_nodes[node].distances;
+ if (distances) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cannot alter an existing nmem_nodes distances se=
t for node: %zu"),
+ node);
+ return 0;
+ }
+
+ if (VIR_ALLOC_N(distances, ndistances) < 0)
+ return 0;
+
+ numa->mem_nodes[node].distances =3D distances;
+ numa->mem_nodes[node].ndistances =3D ndistances;
+
+ return numa->mem_nodes[node].ndistances;
+}
+
+
virBitmapPtr
virDomainNumaGetNodeCpumask(virDomainNumaPtr numa,
size_t node)
@@ -937,6 +1175,20 @@ virDomainNumaGetNodeCpumask(virDomainNumaPtr numa,
}
=20
=20
+virBitmapPtr
+virDomainNumaSetNodeCpumask(virDomainNumaPtr numa,
+ size_t node,
+ virBitmapPtr cpumask)
+{
+ if (!numa || !cpumask)
+ return NULL;
+
+ numa->mem_nodes[node].cpumask =3D cpumask;
+
+ return numa->mem_nodes[node].cpumask;
+}
+
+
virDomainMemoryAccess
virDomainNumaGetNodeMemoryAccessMode(virDomainNumaPtr numa,
size_t node)
diff --git a/src/conf/numa_conf.h b/src/conf/numa_conf.h
index b6a5354..96dda90 100644
--- a/src/conf/numa_conf.h
+++ b/src/conf/numa_conf.h
@@ -87,12 +87,35 @@ int virDomainNumatuneMaybeGetNodeset(virDomainNumaPtr n=
umatune,
=20
size_t virDomainNumaGetNodeCount(virDomainNumaPtr numa);
=20
+size_t virDomainNumaSetNodeCount(virDomainNumaPtr numa,
+ size_t nmem_nodes);
+
+size_t virDomainNumaGetNodeDistance(virDomainNumaPtr numa,
+ size_t node,
+ size_t sibling)
+ ATTRIBUTE_NONNULL(1);
+size_t virDomainNumaSetNodeDistance(virDomainNumaPtr numa,
+ size_t node,
+ size_t sibling,
+ unsigned int value)
+ ATTRIBUTE_NONNULL(1);
+size_t virDomainNumaGetNodeDistanceCount(virDomainNumaPtr numa,
+ size_t node)
+ ATTRIBUTE_NONNULL(1);
+size_t virDomainNumaSetNodeDistanceCount(virDomainNumaPtr numa,
+ size_t node,
+ size_t ndistances)
+ ATTRIBUTE_NONNULL(1);
virBitmapPtr virDomainNumaGetNodeCpumask(virDomainNumaPtr numa,
size_t node)
ATTRIBUTE_NONNULL(1);
virDomainMemoryAccess virDomainNumaGetNodeMemoryAccessMode(virDomainNumaPt=
r numa,
size_t node)
ATTRIBUTE_NONNULL(1);
+virBitmapPtr virDomainNumaSetNodeCpumask(virDomainNumaPtr numa,
+ size_t node,
+ virBitmapPtr cpumask)
+ ATTRIBUTE_NONNULL(1);
unsigned long long virDomainNumaGetNodeMemorySize(virDomainNumaPtr numa,
size_t node)
ATTRIBUTE_NONNULL(1);
@@ -151,7 +174,7 @@ bool virDomainNumatuneNodeSpecified(virDomainNumaPtr nu=
matune,
int cellid);
=20
int virDomainNumaDefCPUParseXML(virDomainNumaPtr def, xmlXPathContextPtr c=
txt);
-int virDomainNumaDefCPUFormat(virBufferPtr buf, virDomainNumaPtr def);
+int virDomainNumaDefCPUFormatXML(virBufferPtr buf, virDomainNumaPtr def);
=20
unsigned int virDomainNumaGetCPUCountTotal(virDomainNumaPtr numa);
=20
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 888412a..b4887c1 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -705,9 +705,15 @@ virDomainNumaGetMaxCPUID;
virDomainNumaGetMemorySize;
virDomainNumaGetNodeCount;
virDomainNumaGetNodeCpumask;
+virDomainNumaGetNodeDistance;
+virDomainNumaGetNodeDistanceCount;
virDomainNumaGetNodeMemoryAccessMode;
virDomainNumaGetNodeMemorySize;
virDomainNumaNew;
+virDomainNumaSetNodeCount;
+virDomainNumaSetNodeCpumask;
+virDomainNumaSetNodeDistance;
+virDomainNumaSetNodeDistanceCount;
virDomainNumaSetNodeMemorySize;
virDomainNumatuneFormatNodeset;
virDomainNumatuneFormatXML;
--=20
2.9.4
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list