From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K6LuP-0005dE-Tq for qemu-devel@nongnu.org; Wed, 11 Jun 2008 04:42:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K6LuM-0005cK-CE for qemu-devel@nongnu.org; Wed, 11 Jun 2008 04:42:21 -0400 Received: from [199.232.76.173] (port=55834 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K6LuL-0005bv-7A for qemu-devel@nongnu.org; Wed, 11 Jun 2008 04:42:17 -0400 Received: from ecfrec.frec.bull.fr ([129.183.4.8]:35847) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K6LuK-00081m-LB for qemu-devel@nongnu.org; Wed, 11 Jun 2008 04:42:17 -0400 From: Laurent Vivier In-Reply-To: <998799A0-66E7-46AF-B423-77C1D51D3DFE@lvivier.info> References: <1212775023.17383.0@ecrins> <998799A0-66E7-46AF-B423-77C1D51D3DFE@lvivier.info> Content-Type: multipart/mixed; boundary="=-IMoYtvy9VHwsLt9ETwBu" Date: Wed, 11 Jun 2008 10:41:38 +0200 Message-Id: <1213173698.3942.7.camel@frecb07144> Mime-Version: 1.0 Subject: [Qemu-devel] [PATCHl] kqemu: Linux CPU accouting Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Steve Fosdick --=-IMoYtvy9VHwsLt9ETwBu Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, Here is a patch allowing to register guest time to guest field of /proc/stat and /proc/%pid/stat (it moves also this part of cpu time from system time to user time). This field is available since linux 2.6.24. To play with it, I provide a second patch which is a patch for procps-3.2.7 allowing to display correctly this value (the per cpu "g" field). For more details, see: http://kerneltrap.org/Linux/Virtual_Machine_Time_Accounting Regards, Laurent -- ------------- Laurent.Vivier@bull.net --------------- "The best way to predict the future is to invent it." - Alan Kay --=-IMoYtvy9VHwsLt9ETwBu Content-Disposition: attachment; filename=kqemu-guest-time.patch Content-Type: text/x-patch; name=kqemu-guest-time.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Index: kqemu-1.4.0pre1/kqemu-linux.c =================================================================== --- kqemu-1.4.0pre1.orig/kqemu-linux.c 2008-06-11 10:29:37.000000000 +0200 +++ kqemu-1.4.0pre1/kqemu-linux.c 2008-06-11 10:31:30.000000000 +0200 @@ -318,7 +318,13 @@ static int kqemu_ioctl(struct inode *ino #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) unlock_kernel(); #endif +#ifdef PF_VCPU + current->flags |= PF_VCPU; +#endif ret = kqemu_exec(s); +#ifdef PF_VCPU + current->flags &= ~PF_VCPU; +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) lock_kernel(); #endif --=-IMoYtvy9VHwsLt9ETwBu Content-Disposition: attachment; filename=procps-3.2.7-guest-time.patch Content-Type: text/x-patch; name=procps-3.2.7-guest-time.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Index: procps-3.2.7/top.c =================================================================== --- procps-3.2.7.orig/top.c 2007-08-10 17:34:46.000000000 +0200 +++ procps-3.2.7/top.c 2007-08-13 13:14:43.000000000 +0200 @@ -935,7 +935,8 @@ static CPU_t *cpus_refresh (CPU_t *cpus) 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 @@ static CPU_t *cpus_refresh (CPU_t *cpus) &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 @@ static CPU_t *cpus_refresh (CPU_t *cpus) 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 @@ static void summaryhlp (CPU_t *cpu, cons // 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 @@ static void summaryhlp (CPU_t *cpu, cons 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 @@ static void summaryhlp (CPU_t *cpu, cons (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 @@ static void summaryhlp (CPU_t *cpu, cons 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-10 17:34:46.000000000 +0200 +++ procps-3.2.7/top.h 2007-08-13 13:14:43.000000000 +0200 @@ -211,8 +211,8 @@ typedef struct HST_t { // 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 @@ typedef struct WIN_t { #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" --=-IMoYtvy9VHwsLt9ETwBu--