[PATCH v3 1/2] util: Add virGetCpuHaltPollTime

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add helper function virGetCpuHaltPollTime 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/virutil.c       | 43 ++++++++++++++++++++++++++++++++++++++++
 src/util/virutil.h       |  4 ++++
 3 files changed, 48 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 68e4b6aab8..64aff4eca4 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3479,6 +3479,7 @@ virDoesUserExist;
 virDoubleToStr;
 virFormatIntDecimal;
 virFormatIntPretty;
+virGetCpuHaltPollTime;
 virGetDeviceID;
 virGetDeviceUnprivSGIO;
 virGetGroupID;
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 311cbbf93a..f5304644c0 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -1936,3 +1936,46 @@ virPipeNonBlock(int fds[2])
 {
     return virPipeImpl(fds, true, true);
 }
+
+int
+virGetCpuHaltPollTime(pid_t pid,
+                      unsigned long long *haltPollSuccess,
+                      unsigned long long *haltPollFail)
+{
+    g_autofree char *pidToStr = NULL;
+    g_autofree char *debugFsPath = NULL;
+    g_autofree char *completePath = NULL;
+    struct dirent *ent = NULL;
+    g_autoptr(DIR) dir = NULL;
+    int ret = -1;
+    bool found = false;
+
+    if (!(debugFsPath = virFileFindMountPoint("debugfs")))
+        return ret;
+
+    completePath = g_strdup_printf("%s/%s", debugFsPath, "kvm");
+    if (virDirOpenIfExists(&dir, completePath) != 1)
+        return ret;
+
+    pidToStr = g_strdup_printf("%d%c", pid, '-');
+    while (virDirRead(dir, &ent, NULL) > 0) {
+        if (STRPREFIX(ent->d_name, pidToStr)) {
+            found = true;
+            break;
+        }
+    }
+
+    if (!found)
+        return ret;
+
+    if (virFileReadValueUllong(haltPollSuccess, "%s/%s/%s", completePath,
+                               ent->d_name, "halt_poll_success_ns") < 0
+        || virFileReadValueUllong(haltPollFail, "%s/%s/%s", completePath,
+                                  ent->d_name, "halt_poll_fail_ns") < 0) {
+        return ret;
+    }
+
+    ret = 0;
+
+    return ret;
+}
diff --git a/src/util/virutil.h b/src/util/virutil.h
index 854b494890..03b225185f 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -225,3 +225,7 @@ int virPipeQuiet(int fds[2]);
  * Returns: -1 on error, 0 on success
  */
 int virPipeNonBlock(int fds[2]);
+
+int virGetCpuHaltPollTime(pid_t pid,
+                          unsigned long long *haltPollSuccess,
+                          unsigned long long *haltPollFail);
-- 
2.23.0





[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux