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 <yangfei85@huawei.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Yang Fei 2021-07-22 16:05:01 +08:00 committed by Michal Privoznik
parent b8674109ee
commit a90b1f24cf
3 changed files with 44 additions and 0 deletions

View File

@ -2376,6 +2376,7 @@ virHookPresent;
# util/virhostcpu.h
virHostCPUGetAvailableCPUsBitmap;
virHostCPUGetCount;
virHostCPUGetHaltPollTime;
virHostCPUGetInfo;
virHostCPUGetKVMMaxVCPUs;
virHostCPUGetMap;

View File

@ -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;
}

View File

@ -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);