[PATCH 1/2] util: Extend virProcessGetStatInfo() for sysTime and userTime
Ján Tomko
jtomko at redhat.com
Mon Sep 5 10:00:17 UTC 2022
On a Monday in 2022, Michal Privoznik wrote:
>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 at redhat.com>
>---
> src/ch/ch_driver.c | 1 +
> src/qemu/qemu_driver.c | 4 +++-
> src/util/virprocess.c | 30 +++++++++++++++++++++++-------
> src/util/virprocess.h | 2 ++
> 4 files changed, 29 insertions(+), 8 deletions(-)
>
>diff --git a/src/util/virprocess.c b/src/util/virprocess.c
>index 013afd91b4..4cc75b8b45 100644
>--- a/src/util/virprocess.c
>+++ b/src/util/virprocess.c
>@@ -1737,19 +1737,24 @@ virProcessGetStat(pid_t pid,
> #ifdef __linux__
> int
> virProcessGetStatInfo(unsigned long long *cpuTime,
>+ unsigned long long *sysTime,
>+ unsigned long long *userTime,
I would expect these to be swapped. time(1) reports user time
before sys time, and they are in that order also in /proc/$PID/stat
> 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 jiff2sec = 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");
>@@ -1758,11 +1763,16 @@ virProcessGetStatInfo(unsigned long long *cpuTime,
> /* We got jiffies
> * We want nanoseconds
> * _SC_CLK_TCK is jiffies per second
>- * So calculate thus....
>+ * So calculate this....
> */
>+ utime *= jiff2sec;
>+ stime *= jiff2sec;
By using the descriptive constnant name, we no longer need the
multi-line comment.
But it converts to ns, so 'jiff2ns' or 'jiff2nsec' would be more
appropriate.
Jano
> if (cpuTime)
>- *cpuTime = 1000ull * 1000ull * 1000ull * (usertime + systime)
>- / (unsigned long long) sysconf(_SC_CLK_TCK);
>+ *cpuTime = utime + stime;
>+ if (sysTime)
>+ *sysTime = stime;
>+ if (userTime)
>+ *userTime = utime;
> if (lastCpu)
> *lastCpu = cpu;
More information about the libvir-list
mailing list