From 9e7dd43ab7b2e68177cefd49b3c07311ea79bc1a Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Tue, 7 Feb 2012 10:10:10 -0600 Subject: [PATCH] top: tweak the new 'reduce % CPU distortions' algorithm The original approach to potential % CPU distortion due to Nehalem type cores being turned off completely when idle worked ok until the user typed something. At that point, elapsed tics would no longer equal the calculated value producing an undesirable 100% idle condition until the next update or key. This commit employs actual elapsed tics in determining whether a cpu should be considered idle and thus makes top's individual cpu display immune to user keystrokes. --- top/top.c | 8 +++++++- top/top.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/top/top.c b/top/top.c index 8d24962e..45835052 100644 --- a/top/top.c +++ b/top/top.c @@ -1823,6 +1823,9 @@ static CPU_t *cpus_refresh (CPU_t *cpus) { , &cpus[Cpu_faux_tot].cur.i, &cpus[Cpu_faux_tot].cur.w, &cpus[Cpu_faux_tot].cur.x , &cpus[Cpu_faux_tot].cur.y, &cpus[Cpu_faux_tot].cur.z)) error_exit(N_txt(FAIL_statget_txt)); + cpus[Cpu_faux_tot].cur.tot = cpus[Cpu_faux_tot].cur.u + cpus[Cpu_faux_tot].cur.s + + cpus[Cpu_faux_tot].cur.n + cpus[Cpu_faux_tot].cur.i + cpus[Cpu_faux_tot].cur.w + + cpus[Cpu_faux_tot].cur.x + cpus[Cpu_faux_tot].cur.y + cpus[Cpu_faux_tot].cur.z; // now value each separate cpu's tics, maybe for (i = 0; i < Cpu_faux_tot && i < Screen_rows; i++) { @@ -1841,6 +1844,9 @@ static CPU_t *cpus_refresh (CPU_t *cpus) { memmove(&cpus[i], &cpus[Cpu_faux_tot], sizeof(CPU_t)); break; // tolerate cpus taken offline } + cpus[i].cur.tot = cpus[i].cur.u + cpus[i].cur.s + + cpus[i].cur.n + cpus[i].cur.i + cpus[i].cur.w + + cpus[i].cur.x + cpus[i].cur.y + cpus[i].cur.z; #ifdef PRETEND4CPUS cpus[i].id = i; #endif @@ -3332,7 +3338,7 @@ static void summaryhlp (CPU_t *cpu, const char *pfx) { #ifdef CPU_ZEROTICS if (1 > tot_frme) tot_frme = 1; #else - if (tot_frme < ((smp_num_cpus * 10) * Rc.delay_time)) + if (tot_frme < (cpu->cur.tot - cpu->sav.tot) / 10) tot_frme = u_frme = s_frme = n_frme = i_frme = w_frme = x_frme = y_frme = z_frme = 0; if (1 > tot_frme) i_frme = tot_frme = 1; #endif diff --git a/top/top.h b/top/top.h index c4daa1bb..fda84412 100644 --- a/top/top.h +++ b/top/top.h @@ -214,6 +214,7 @@ typedef struct CT_t { 2.6.0 kernel: x == hi (hardware irq time), y == si (software irq time) 2.6.11 kernel: z == st (virtual steal time) */ TIC_t u, n, s, i, w, x, y, z; // as represented in /proc/stat + SIC_t tot; // total of above } CT_t; typedef struct CPU_t {