On Sun, Nov 21, 2021 at 12:04:26AM +0100, Martin Kletzander wrote:
This eliminates one incorrect parsing implementation.
Please explain what was being done wrongly / what was the
effect of the bug ?
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/qemu/qemu_driver.c | 33 ++++++-----------------------
src/util/virprocess.c | 48 ++++++------------------------------------
2 files changed, 12 insertions(+), 69 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index d954635dde2a..0468d6aaf314 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1399,36 +1399,17 @@ qemuGetSchedInfo(unsigned long long *cpuWait,
static int
qemuGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
- pid_t pid, int tid)
+ pid_t pid, pid_t tid)
{
- g_autofree char *proc = NULL;
- FILE *pidinfo;
+ g_auto(GStrv) proc_stat = virProcessGetStat(pid, tid);
unsigned long long usertime = 0, systime = 0;
long rss = 0;
int cpu = 0;
- /* In general, we cannot assume pid_t fits in int; but /proc parsing
- * is specific to Linux where int works fine. */
- if (tid)
- proc = g_strdup_printf("/proc/%d/task/%d/stat", (int)pid, tid);
- else
- proc = g_strdup_printf("/proc/%d/stat", (int)pid);
- if (!proc)
- return -1;
-
- pidinfo = fopen(proc, "r");
-
- /* See 'man proc' for information about what all these fields are.
We're
- * only interested in a very few of them */
- if (!pidinfo ||
- fscanf(pidinfo,
- /* pid -> stime */
- "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %llu
%llu"
- /* cutime -> endcode */
- "%*d %*d %*d %*d %*d %*d %*u %*u %ld %*u %*u %*u"
- /* startstack -> processor */
- "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %d",
- &usertime, &systime, &rss, &cpu) != 4) {
+ if (virStrToLong_ullp(proc_stat[13], NULL, 10, &usertime) < 0 ||
+ virStrToLong_ullp(proc_stat[14], NULL, 10, &systime) < 0 ||
+ virStrToLong_l(proc_stat[23], NULL, 10, &rss) < 0 ||
+ virStrToLong_i(proc_stat[38], NULL, 10, &cpu) < 0) {
Since you're adding a formal API, I think we'd benefit from
constants for these array indexes in virprocess.h
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|