[libvirt] [PATCH 2/2] Resctrl: expose cache information to capabilities

Eli Qiao liyong.qiao at intel.com
Wed Jan 18 07:26:20 UTC 2017


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 at 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




More information about the libvir-list mailing list