[libvirt] [v7 10/10] Resctrl: Scan resctrl before doing cache allocation

Eli Qiao liyong.qiao at intel.com
Thu Feb 16 09:35:21 UTC 2017


Other application may touch resctrl while libvirt's running, scan
resctrl again before allocating cache information to the newly created
VM.

Signed-off-by: Eli Qiao <liyong.qiao at intel.com>
---
 src/util/virresctrl.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index 2b1ee41..f13bce1 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -897,6 +897,46 @@ virResCtrlAppendDomain(virResDomainPtr dom)
     return 0;
 }
 
+/* scan /sys/fs/resctrl again and refresh default schemata */
+static
+int virResCtrlScan(void)
+{
+    struct dirent *ent;
+    DIR *dp = NULL;
+    int direrr;
+    virResDomainPtr p;
+    int rc = -1;
+
+    if (virDirOpenQuiet(&dp, RESCTRL_DIR) < 0) {
+        if (errno == ENOENT)
+            return -1;
+        VIR_ERROR(_("Unable to open %s (%d)"), RESCTRL_DIR, errno);
+        goto cleanup;
+    }
+
+    while ((direrr = virDirRead(dp, &ent, NULL)) > 0) {
+        if ((ent->d_type != DT_DIR) || STREQ(ent->d_name, "info"))
+            continue;
+        /* test if we'v tracked all domains */
+        p = virResCtrlGetDomain(ent->d_name);
+        if (p == NULL) {
+            p = virResCtrlLoadDomain(ent->d_name);
+            if (p == NULL)
+                continue;
+            /* This domain is not created by libvirt, so we don't care
+             * about the tasks, add a fake one to prevent virResCtrlRefresh
+             * remove it from sysfs */
+            virResCtrlAddTask(p, 1);
+            virResCtrlAppendDomain(p);
+        }
+    }
+    rc = 0;
+
+ cleanup:
+    VIR_DIR_CLOSE(dp);
+    return rc;
+}
+
 static int
 virResCtrlGetSocketIdByHostID(int type, unsigned int hostid)
 {
@@ -1003,6 +1043,10 @@ int virResCtrlSetCacheBanks(virDomainCachetunePtr cachetune,
         goto cleanup;
     }
 
+    if (virResCtrlScan() < 0) {
+        VIR_ERROR(_("Failed to scan resctrl domain dir"));
+        return -1;
+    }
     p = virResCtrlGetDomain(name);
     if (p == NULL) {
         VIR_DEBUG("no domain name %s found, create new one!", name);
-- 
1.9.1




More information about the libvir-list mailing list