]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Extend virProcessGetStatInfo() for sysTime and userTime
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 9 Aug 2022 14:15:55 +0000 (16:15 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 5 Sep 2022 11:55:11 +0000 (13:55 +0200)
The virProcessGetStatInfo() helper parses /proc stat file for
given PID and/or TID and reports cumulative cpuTime which is just
a sum of user and sys times. But in near future, we'll need those
times separately, so make the function return them too (if caller
desires).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/ch/ch_driver.c
src/qemu/qemu_driver.c
src/util/virprocess.c
src/util/virprocess.h

index e7c172c89469953e3babbf46e75018eedb1f8829..bde148075dc2916ee8a8ffde3a95c500f97c1b3d 100644 (file)
@@ -1075,6 +1075,7 @@ chDomainHelperGetVcpus(virDomainObj *vm,
             vcpuinfo->number = i;
             vcpuinfo->state = VIR_VCPU_RUNNING;
             if (virProcessGetStatInfo(&vcpuinfo->cpuTime,
+                                      NULL, NULL,
                                       &vcpuinfo->cpu, NULL,
                                       vm->pid, vcpupid) < 0) {
                 virReportSystemError(errno, "%s",
index 707f4cc1bbbc7a899c09d5127679235838ca3f22..d7283a6e4738dba8e821cb368a5d2f1a494662eb 100644 (file)
@@ -1360,6 +1360,7 @@ qemuDomainHelperGetVcpus(virDomainObj *vm,
             vcpuinfo->state = VIR_VCPU_RUNNING;
 
             if (virProcessGetStatInfo(&vcpuinfo->cpuTime,
+                                      NULL, NULL,
                                       &vcpuinfo->cpu, NULL,
                                       vm->pid, vcpupid) < 0) {
                 virReportSystemError(errno, "%s",
@@ -2516,6 +2517,7 @@ qemuDomainGetInfo(virDomainPtr dom,
 
     if (virDomainObjIsActive(vm)) {
         if (virProcessGetStatInfo(&(info->cpuTime), NULL, NULL,
+                                  NULL, NULL,
                                   vm->pid, 0) < 0) {
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                            _("cannot read cputime for domain"));
@@ -10676,7 +10678,7 @@ qemuDomainMemoryStatsInternal(virDomainObj *vm,
         ret = 0;
     }
 
-    if (virProcessGetStatInfo(NULL, NULL, &rss, vm->pid, 0) < 0) {
+    if (virProcessGetStatInfo(NULL, NULL, NULL, NULL, &rss, vm->pid, 0) < 0) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                        _("cannot get RSS for domain"));
     } else {
index 013afd91b4cb8d3b683943ce6d2753b1217ae295..11f36e00a87fde97a59feb3cf8082e0bb25dbadb 100644 (file)
@@ -1737,32 +1737,37 @@ virProcessGetStat(pid_t pid,
 #ifdef __linux__
 int
 virProcessGetStatInfo(unsigned long long *cpuTime,
+                      unsigned long long *userTime,
+                      unsigned long long *sysTime,
                       int *lastCpu,
                       long *vm_rss,
                       pid_t pid,
                       pid_t tid)
 {
     g_auto(GStrv) proc_stat = virProcessGetStat(pid, tid);
-    unsigned long long usertime = 0, systime = 0;
+    unsigned long long utime = 0;
+    unsigned long long stime = 0;
+    const unsigned long long jiff2nsec = 1000ull * 1000ull * 1000ull /
+                                         (unsigned long long) sysconf(_SC_CLK_TCK);
     long rss = 0;
     int cpu = 0;
 
     if (!proc_stat ||
-        virStrToLong_ullp(proc_stat[VIR_PROCESS_STAT_UTIME], NULL, 10, &usertime) < 0 ||
-        virStrToLong_ullp(proc_stat[VIR_PROCESS_STAT_STIME], NULL, 10, &systime) < 0 ||
+        virStrToLong_ullp(proc_stat[VIR_PROCESS_STAT_UTIME], NULL, 10, &utime) < 0 ||
+        virStrToLong_ullp(proc_stat[VIR_PROCESS_STAT_STIME], NULL, 10, &stime) < 0 ||
         virStrToLong_l(proc_stat[VIR_PROCESS_STAT_RSS], NULL, 10, &rss) < 0 ||
         virStrToLong_i(proc_stat[VIR_PROCESS_STAT_PROCESSOR], NULL, 10, &cpu) < 0) {
         VIR_WARN("cannot parse process status data");
     }
 
-    /* We got jiffies
-     * We want nanoseconds
-     * _SC_CLK_TCK is jiffies per second
-     * So calculate thus....
-     */
+    utime *= jiff2nsec;
+    stime *= jiff2nsec;
     if (cpuTime)
-        *cpuTime = 1000ull * 1000ull * 1000ull * (usertime + systime)
-            / (unsigned long long) sysconf(_SC_CLK_TCK);
+        *cpuTime = utime + stime;
+    if (userTime)
+        *userTime = utime;
+    if (sysTime)
+        *sysTime = stime;
     if (lastCpu)
         *lastCpu = cpu;
 
@@ -1771,7 +1776,7 @@ virProcessGetStatInfo(unsigned long long *cpuTime,
 
 
     VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld",
-              (int) pid, tid, usertime, systime, cpu, rss);
+              (int) pid, tid, utime, stime, cpu, rss);
 
     return 0;
 }
@@ -1844,6 +1849,8 @@ virProcessGetSchedInfo(unsigned long long *cpuWait,
 #else
 int
 virProcessGetStatInfo(unsigned long long *cpuTime,
+                      unsigned long long *userTime,
+                      unsigned long long *sysTime,
                       int *lastCpu,
                       long *vm_rss,
                       pid_t pid G_GNUC_UNUSED,
@@ -1853,6 +1860,10 @@ virProcessGetStatInfo(unsigned long long *cpuTime,
      * platforms, so just report neutral values */
     if (cpuTime)
         *cpuTime = 0;
+    if (userTime)
+        *userTime = 0;
+    if (sysTime)
+        *sysTime = 0;
     if (lastCpu)
         *lastCpu = 0;
     if (vm_rss)
index 30b6981c739303d276fd203650db813c6e4bb4ce..91ad5618dbe4aa2d059a5afbdbe0a133fb624e9c 100644 (file)
@@ -195,6 +195,8 @@ typedef enum {
 int virProcessNamespaceAvailable(unsigned int ns);
 
 int virProcessGetStatInfo(unsigned long long *cpuTime,
+                          unsigned long long *userTime,
+                          unsigned long long *sysTime,
                           int *lastCpu,
                           long *vm_rss,
                           pid_t pid,