diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index 2a32b4ca06..c4f2ef10c1 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -82,8 +82,6 @@ VIR_ENUM_IMPL(virDomainMemoryLatency,
"write"
);
-typedef struct _virNumaCache virNumaCache;
-
typedef struct _virDomainNumaInterconnect virDomainNumaInterconnect;
typedef struct _virDomainNumaNode virDomainNumaNode;
@@ -107,13 +105,7 @@ struct _virDomainNuma {
virNumaDistance *distances; /* remote node distances */
size_t ndistances;
- struct _virNumaCache {
- unsigned int level; /* cache level */
- unsigned int size; /* cache size */
- unsigned int line; /* line size, !!! in bytes !!! */
- virNumaCacheAssociativity associativity; /* cache associativity */
- virNumaCachePolicy policy; /* cache policy */
- } *caches;
+ virNumaCache *caches;
size_t ncaches;
} *mem_nodes; /* guest node configuration */
size_t nmem_nodes;
@@ -1102,7 +1094,6 @@ virDomainNumaDefFormatXML(virBuffer *buf,
virBitmap *cpumask = virDomainNumaGetNodeCpumask(def, i);
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
- size_t j;
memAccess = virDomainNumaGetNodeMemoryAccessMode(def, i);
discard = virDomainNumaGetNodeDiscard(def, i);
@@ -1131,35 +1122,9 @@ virDomainNumaDefFormatXML(virBuffer *buf,
def->mem_nodes[i].distances,
def->mem_nodes[i].ndistances);
- for (j = 0; j < def->mem_nodes[i].ncaches; j++) {
- virNumaCache *cache = &def->mem_nodes[i].caches[j];
-
- virBufferAsprintf(&childBuf, "level);
- if (cache->associativity) {
- virBufferAsprintf(&childBuf, " associativity='%s'",
- virNumaCacheAssociativityTypeToString(cache->associativity));
- }
-
- if (cache->policy) {
- virBufferAsprintf(&childBuf, " policy='%s'",
- virNumaCachePolicyTypeToString(cache->policy));
- }
- virBufferAddLit(&childBuf, ">\n");
-
- virBufferAdjustIndent(&childBuf, 2);
- virBufferAsprintf(&childBuf,
- "\n",
- cache->size);
-
- if (cache->line) {
- virBufferAsprintf(&childBuf,
- "\n",
- cache->line);
- }
-
- virBufferAdjustIndent(&childBuf, -2);
- virBufferAddLit(&childBuf, "\n");
- }
+ virNumaCacheFormat(&childBuf,
+ def->mem_nodes[i].caches,
+ def->mem_nodes[i].ncaches);
virXMLFormatElement(buf, "cell", &attrBuf, &childBuf);
}
@@ -1839,3 +1804,41 @@ virNumaDistanceFormat(virBuffer *buf,
virXMLFormatElement(buf, "distances", NULL, &childBuf);
}
+
+
+void
+virNumaCacheFormat(virBuffer *buf,
+ const virNumaCache *caches,
+ size_t ncaches)
+{
+ size_t i;
+
+ for (i = 0; i < ncaches; i++) {
+ const virNumaCache *cache = &caches[i];
+ g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
+ g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+
+ virBufferAsprintf(&attrBuf, " level='%u'", cache->level);
+ if (cache->associativity) {
+ virBufferAsprintf(&attrBuf, " associativity='%s'",
+ virNumaCacheAssociativityTypeToString(cache->associativity));
+ }
+
+ if (cache->policy) {
+ virBufferAsprintf(&attrBuf, " policy='%s'",
+ virNumaCachePolicyTypeToString(cache->policy));
+ }
+
+ virBufferAsprintf(&childBuf,
+ "\n",
+ cache->size);
+
+ if (cache->line) {
+ virBufferAsprintf(&childBuf,
+ "\n",
+ cache->line);
+ }
+
+ virXMLFormatElement(buf, "cache", &attrBuf, &childBuf);
+ }
+}
diff --git a/src/conf/numa_conf.h b/src/conf/numa_conf.h
index 1ef6455fb5..9dee4f3a40 100644
--- a/src/conf/numa_conf.h
+++ b/src/conf/numa_conf.h
@@ -259,3 +259,16 @@ struct _virNumaDistance {
void virNumaDistanceFormat(virBuffer *buf,
const virNumaDistance *distances,
size_t ndistances);
+
+typedef struct _virNumaCache virNumaCache;
+struct _virNumaCache {
+ unsigned int level; /* cache level */
+ unsigned int size; /* cache size */
+ unsigned int line; /* line size, !!! in bytes !!! */
+ virNumaCacheAssociativity associativity; /* cache associativity */
+ virNumaCachePolicy policy; /* cache policy */
+};
+
+void virNumaCacheFormat(virBuffer *buf,
+ const virNumaCache *caches,
+ size_t ncaches);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 9e9171a6d9..abe4525163 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -911,6 +911,7 @@ virDomainNumatuneSet;
virDomainNumatuneSpecifiedMaxNode;
virNumaCacheAssociativityTypeFromString;
virNumaCacheAssociativityTypeToString;
+virNumaCacheFormat;
virNumaCachePolicyTypeFromString;
virNumaCachePolicyTypeToString;
virNumaDistanceFormat;