This patch expose cache information to host's capabilites xml.
<cache>
<bank id='0' type='l3' size='56320' unit='KiB'
cpus='0-21,44-65' min='2816' scope='L3DATA'/>
<bank id='1' type='l3' size='56320' unit='KiB'
cpus='22-43,66-87' min='2816' scope='L3DATA'/>
<bank id='2' type='l3' size='56320' unit='KiB'
cpus='0-21,44-65' min='2816' scope='L3CODE'/>
<bank id='3' type='l3' size='56320' unit='KiB'
cpus='22-43,66-87' min='2816' scope='L3CODE'/>
</cache>
There are some nits difference from RFC on mailing list.
https://www.redhat.com/archives/libvir-list/2017-January/msg00644.html
Signed-off-by: Eli Qiao <liyong.qiao(a)intel.com>
---
src/conf/capabilities.c | 30 ++++++++++++++++++++++++++++++
src/conf/capabilities.h | 15 +++++++++++++++
src/libvirt_private.syms | 1 +
src/qemu/qemu_capabilities.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_driver.c | 4 ++++
5 files changed, 92 insertions(+)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 9ab343b..26aef73 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -844,6 +844,31 @@ virCapabilitiesFormatNUMATopology(virBufferPtr buf,
return 0;
}
+static int
+virCapabilitiesFormatCache(virBufferPtr buf,
+ size_t ncachebank,
+ virCapsHostCacheBankPtr *cachebank)
+{
+ size_t i;
+
+ virBufferAddLit(buf, "<cache>\n");
+ virBufferAdjustIndent(buf, 2);
+
+ for( i = 0 ; i < ncachebank; i++) {
+ virBufferAsprintf(buf,
+ "<bank id='%u' type='%s'
size='%llu' unit='KiB' cpus='%s' min='%llu'
scope='%s'/>\n",
+ cachebank[i]->id,
+ cachebank[i]->type,
+ cachebank[i]->size,
+ cachebank[i]->cpus,
+ cachebank[i]->min,
+ cachebank[i]->scope);
+ }
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</cache>\n");
+ return 0;
+}
+
/**
* virCapabilitiesFormatXML:
* @caps: capabilities to format
@@ -931,6 +956,11 @@ virCapabilitiesFormatXML(virCapsPtr caps)
virBufferAddLit(&buf, "</migration_features>\n");
}
+ if (caps->host.ncachebank &&
+ virCapabilitiesFormatCache(&buf, caps->host.ncachebank,
+ caps->host.cachebank) < 0)
+ return NULL;
+
if (caps->host.netprefix)
virBufferAsprintf(&buf, "<netprefix>%s</netprefix>\n",
caps->host.netprefix);
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index cfdc34a..b9f4633 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -138,6 +138,17 @@ struct _virCapsHostSecModel {
virCapsHostSecModelLabelPtr labels;
};
+typedef struct _virCapsHostCacheBank virCapsHostCacheBank;
+typedef virCapsHostCacheBank *virCapsHostCacheBankPtr;
+struct _virCapsHostCacheBank {
+ unsigned int id;
+ char* type;
+ char* cpus;
+ unsigned long long size;
+ unsigned long long min;
+ char* scope;
+};
+
typedef struct _virCapsHost virCapsHost;
typedef virCapsHost *virCapsHostPtr;
struct _virCapsHost {
@@ -160,6 +171,10 @@ struct _virCapsHost {
size_t nsecModels;
virCapsHostSecModelPtr secModels;
+ size_t ncachebank;
+ size_t ncachebank_max;
+ virCapsHostCacheBankPtr *cachebank;
+
char *netprefix;
virCPUDefPtr cpu;
int nPagesSize; /* size of pagesSize array */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fe1334d..bdd717a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2298,6 +2298,7 @@ virRandomInt;
# util/virresctrl.h
virResCtrlAvailable;
virResCtrlInit;
+virResCtrlGet;
# util/virrotatingfile.h
virRotatingFileReaderConsume;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 5427059..99cc7ce 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -45,6 +45,7 @@
#include "qemu_domain.h"
#define __QEMU_CAPSRIV_H_ALLOW__
#include "qemu_capspriv.h"
+#include "virresctrl.h"
#include <fcntl.h>
#include <sys/stat.h>
@@ -1093,7 +1094,45 @@ virQEMUCapsInitCPU(virCapsPtr caps,
goto cleanup;
}
+static int
+virQEMUCapsInitCache(virCapsPtr caps)
+{
+ int i, j;
+ unsigned bk_id = 0;
+ virResCtrlPtr resctrl;
+ virCapsHostCacheBankPtr bank;
+ for (i = 0; i < RDT_NUM_RESOURCES; i ++)
+ {
+ resctrl = virResCtrlGet(i);
+ if(resctrl->enabled) {
+ for( j = 0; j < resctrl->num_sockets; j++)
+ {
+ if(VIR_RESIZE_N(caps->host.cachebank, caps->host.ncachebank_max,
+ caps->host.ncachebank, 1) < 0)
+ return -1;
+
+ if(VIR_ALLOC(bank) < 0)
+ return -1;
+
+ bank->id = bk_id++;
+ if(VIR_STRDUP(bank->type, resctrl->cache_level) < 0)
+ goto err;
+ if(VIR_STRDUP(bank->scope, resctrl->name) < 0)
+ goto err;
+ if(VIR_STRDUP(bank->cpus, virBitmapFormat(resctrl->cpu_mask[j]))
< 0)
+ goto err;
+ bank->size = resctrl->cache_size[j];
+ bank->min = resctrl->cache_min[j];
+ caps->host.cachebank[caps->host.ncachebank++] = bank;
+ }
+ }
+ }
+ return 0;
+err:
+ VIR_FREE(bank);
+ return -1;
+}
static int
virQEMUCapsInitPages(virCapsPtr caps)
{
@@ -1139,6 +1178,9 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache)
if (virQEMUCapsInitCPU(caps, hostarch) < 0)
VIR_WARN("Failed to get host CPU");
+ if (virQEMUCapsInitCache(caps) < 0)
+ VIR_WARN("Failed to get host cache");
+
/* Add the power management features of the host */
if (virNodeSuspendGetTargetMask(&caps->host.powerMgmt) < 0)
VIR_WARN("Failed to get host power management capabilities");
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b359e77..91afc34 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -105,6 +105,7 @@
#include "vircgroup.h"
#include "virperf.h"
#include "virnuma.h"
+#include "virresctrl.h"
#include "dirname.h"
#include "network/bridge_driver.h"
@@ -842,6 +843,9 @@ qemuStateInitialize(bool privileged,
run_gid = cfg->group;
}
+ if(virResCtrlAvailable() && virResCtrlInit() < 0)
+ VIR_WARN("Faild to initialize resource control.");
+
qemu_driver->qemuCapsCache = virQEMUCapsCacheNew(cfg->libDir,
cfg->cacheDir,
run_uid,
--
1.9.1