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