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(a)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