[PATCH v4 2/3] util: Add virHostCPUGetHaltPollTime

Yang Fei yangfei85 at huawei.com
Thu Jul 22 08:05:01 UTC 2021


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 at huawei.com>
---
 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





More information about the libvir-list mailing list