Re: [PATCH 2/2][KVM] modify account_system_time() to add cputimeto cpustat->guest

From: Laurent Vivier
Date: Fri Aug 10 2007 - 12:11:16 EST


You can find attached to this email the patch to apply to procps-3.2.7[1] to
allow "top(1)" to display the cpu guest time.

Laurent
[1] http://procps.sf.net/procps-3.2.7.tar.gz
--
------------- Laurent.Vivier@xxxxxxxx --------------
"Software is hard" - Donald Knuth
Index: procps-3.2.7/top.c
===================================================================
--- procps-3.2.7.orig/top.c 2007-08-08 16:13:17.000000000 +0200
+++ procps-3.2.7/top.c 2007-08-10 16:46:01.000000000 +0200
@@ -935,7 +935,8 @@
cpus[Cpu_tot].x = 0; // FIXME: can't tell by kernel version number
cpus[Cpu_tot].y = 0; // FIXME: can't tell by kernel version number
cpus[Cpu_tot].z = 0; // FIXME: can't tell by kernel version number
- num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
+ cpus[Cpu_tot].g = 0; // FIXME: can't tell by kernel version number
+ num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
&cpus[Cpu_tot].u,
&cpus[Cpu_tot].n,
&cpus[Cpu_tot].s,
@@ -943,7 +944,8 @@
&cpus[Cpu_tot].w,
&cpus[Cpu_tot].x,
&cpus[Cpu_tot].y,
- &cpus[Cpu_tot].z
+ &cpus[Cpu_tot].z,
+ &cpus[Cpu_tot].g
);
if (num < 4)
std_err("failed /proc/stat read");
@@ -960,9 +962,10 @@
cpus[i].x = 0; // FIXME: can't tell by kernel version number
cpus[i].y = 0; // FIXME: can't tell by kernel version number
cpus[i].z = 0; // FIXME: can't tell by kernel version number
- num = sscanf(buf, "cpu%u %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
+ cpus[i].g = 0; // FIXME: can't tell by kernel version number
+ num = sscanf(buf, "cpu%u %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
&cpus[i].id,
- &cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y, &cpus[i].z
+ &cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y, &cpus[i].z, &cpus[i].g
);
if (num < 4)
std_err("failed /proc/stat read");
@@ -2879,10 +2882,11 @@
// we'll trim to zero if we get negative time ticks,
// which has happened with some SMP kernels (pre-2.4?)
#define TRIMz(x) ((tz = (SIC_t)(x)) < 0 ? 0 : tz)
- SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz;
+ SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, g_frme, tot_frme, tz, u_tmp;
float scale;

- u_frme = cpu->u - cpu->u_sav;
+ u_tmp = cpu->u - cpu->g;
+ u_frme = TRIMz(u_tmp - cpu->u_sav);
s_frme = cpu->s - cpu->s_sav;
n_frme = cpu->n - cpu->n_sav;
i_frme = TRIMz(cpu->i - cpu->i_sav);
@@ -2890,7 +2894,8 @@
x_frme = cpu->x - cpu->x_sav;
y_frme = cpu->y - cpu->y_sav;
z_frme = cpu->z - cpu->z_sav;
- tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme;
+ g_frme = cpu->g - cpu->g_sav;
+ tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme + g_frme;
if (tot_frme < 1) tot_frme = 1;
scale = 100.0 / (float)tot_frme;

@@ -2908,13 +2913,14 @@
(float)w_frme * scale,
(float)x_frme * scale,
(float)y_frme * scale,
- (float)z_frme * scale
+ (float)z_frme * scale,
+ (float)g_frme * scale
)
);
Msg_row += 1;

// remember for next time around
- cpu->u_sav = cpu->u;
+ cpu->u_sav = u_tmp;
cpu->s_sav = cpu->s;
cpu->n_sav = cpu->n;
cpu->i_sav = cpu->i;
@@ -2922,6 +2928,7 @@
cpu->x_sav = cpu->x;
cpu->y_sav = cpu->y;
cpu->z_sav = cpu->z;
+ cpu->g_sav = cpu->g;

#undef TRIMz
}
Index: procps-3.2.7/top.h
===================================================================
--- procps-3.2.7.orig/top.h 2007-08-08 16:14:47.000000000 +0200
+++ procps-3.2.7/top.h 2007-08-08 17:01:45.000000000 +0200
@@ -211,8 +211,8 @@
// calculations. It exists primarily for SMP support but serves
// all environments.
typedef struct CPU_t {
- TIC_t u, n, s, i, w, x, y, z; // as represented in /proc/stat
- TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav, z_sav; // in the order of our display
+ TIC_t u, n, s, i, w, x, y, z, g; // as represented in /proc/stat
+ TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav, z_sav, g_sav; // in the order of our display
unsigned id; // the CPU ID number
} CPU_t;

@@ -390,7 +390,7 @@
#define STATES_line2x6 "%s\03" \
" %#4.1f%% \02us,\03 %#4.1f%% \02sy,\03 %#4.1f%% \02ni,\03 %#4.1f%% \02id,\03 %#4.1f%% \02wa,\03 %#4.1f%% \02hi,\03 %#4.1f%% \02si\03\n"
#define STATES_line2x7 "%s\03" \
- "%#5.1f%%\02us,\03%#5.1f%%\02sy,\03%#5.1f%%\02ni,\03%#5.1f%%\02id,\03%#5.1f%%\02wa,\03%#5.1f%%\02hi,\03%#5.1f%%\02si,\03%#5.1f%%\02st\03\n"
+ "%#4.1f%%\02us,\03%#4.1f%%\02sy,\03%#4.1f%%\02ni,\03%#5.1f%%\02id,\03%#4.1f%%\02wa,\03%#4.1f%%\02hi,\03%#4.1f%%\02si,\03%#4.1f%%\02st\03,\02%#4.1f%%\02g\n"
#ifdef CASEUP_SUMMK
#define MEMORY_line1 "Mem: \03" \
" %8luK \02total,\03 %8luK \02used,\03 %8luK \02free,\03 %8luK \02buffers\03\n"