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