From a90b1f24cf0650449cdc0649302d4e8ad99502fc Mon Sep 17 00:00:00 2001 From: Yang Fei Date: Thu, 22 Jul 2021 16:05:01 +0800 Subject: [PATCH] util: Add virHostCPUGetHaltPollTime 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 Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- 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 5c7f6bf809..43493ea76e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2376,6 +2376,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..7aa92ad11d 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-", (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);