[PATCH v4 2/3] util: Add virHostCPUGetHaltPollTime

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add helper function virHostCPUGetHaltPollTime to obtain halt polling
time. If the kernel support halt polling time statistic, and mount
debugfs. This function will take effect on KVM VMs.

Signed-off-by: Yang Fei <yangfei85@xxxxxxxxxx>
---
 src/libvirt_private.syms |  1 +
 src/util/virhostcpu.c    | 39 +++++++++++++++++++++++++++++++++++++++
 src/util/virhostcpu.h    |  4 ++++
 3 files changed, 44 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5429a82a7c..531ba03cf7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2374,6 +2374,7 @@ virHookPresent;
 # util/virhostcpu.h
 virHostCPUGetAvailableCPUsBitmap;
 virHostCPUGetCount;
+virHostCPUGetHaltPollTime;
 virHostCPUGetInfo;
 virHostCPUGetKVMMaxVCPUs;
 virHostCPUGetMap;
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
index bf7fda23af..7f577c3e3e 100644
--- a/src/util/virhostcpu.c
+++ b/src/util/virhostcpu.c
@@ -1535,3 +1535,42 @@ virHostCPUGetSignature(char **signature)
 }
 
 #endif /* __linux__ */
+
+int
+virHostCPUGetHaltPollTime(pid_t pid,
+                      unsigned long long *haltPollSuccess,
+                      unsigned long long *haltPollFail)
+{
+    g_autofree char *pidToStr = NULL;
+    g_autofree char *debugFsPath = NULL;
+    g_autofree char *kvmPath = NULL;
+    struct dirent *ent = NULL;
+    g_autoptr(DIR) dir = NULL;
+    bool found = false;
+
+    if (!(debugFsPath = virFileFindMountPoint("debugfs")))
+        return -1;
+
+    kvmPath = g_strdup_printf("%s/%s", debugFsPath, "kvm");
+    if (virDirOpenQuiet(&dir, kvmPath) != 1)
+        return -1;
+
+    pidToStr = g_strdup_printf("%lld%c", (long long)pid, '-');
+    while (virDirRead(dir, &ent, NULL) > 0) {
+        if (STRPREFIX(ent->d_name, pidToStr)) {
+            found = true;
+            break;
+        }
+    }
+
+    if (!found)
+        return -1;
+
+    if (virFileReadValueUllongQuiet(haltPollSuccess, "%s/%s/%s", kvmPath,
+                                    ent->d_name, "halt_poll_success_ns") < 0 ||
+        virFileReadValueUllongQuiet(haltPollFail, "%s/%s/%s", kvmPath,
+                                    ent->d_name, "halt_poll_fail_ns") < 0)
+        return -1;
+
+    return 0;
+}
diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h
index fc717250d9..d98385d53f 100644
--- a/src/util/virhostcpu.h
+++ b/src/util/virhostcpu.h
@@ -83,3 +83,7 @@ int virHostCPUGetMSR(unsigned long index,
 virHostCPUTscInfo *virHostCPUGetTscInfo(void);
 
 int virHostCPUGetSignature(char **signature);
+
+int virHostCPUGetHaltPollTime(pid_t pid,
+                              unsigned long long *haltPollSuccess,
+                              unsigned long long *haltPollFail);
-- 
2.23.0





[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux