[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH v2 1/2] top: remove 'cruft' the process display code.
From:       David Laight <David.Laight () ACULAB ! COM>
Date:       2021-11-12 12:51:38
Message-ID: 19a7eedb1dd641b6a5b91ed340b4845d () AcuMS ! aculab ! com
[Download RAW message or body]

Simplify process cpu% and vsz% calculations.

Remove the code that avoided integer divides when generating the cpu%.
The loop will be dominated by the system calls to read the command line.
So even if the division is a code loop it is probably noise.

On Linux the process cpu time values are in 'jiffies' so there is
no need to re-scale the values based on the sum of the process times.
(This was already assumed because of issues with short lived processes.)

Signed-off-by: David Laight <david.laight@aculab.com>

---


--- a/top.c	2021-11-11 09:49:08.165982660 +0000
+++ b/top.c	2021-11-12 11:25:43.849264597 +0000
@@ -139,7 +139,6 @@
 	unsigned long long usr, nic, sys, idle;
 	unsigned long long iowait, irq, softirq, steal;
 	unsigned long long total;
-	unsigned long long busy;
 } jiffy_counts_t;
 
 /* This structure stores some critical information from one frame to
@@ -292,8 +291,6 @@
 	if (ret >= 4) {
 		p_jif->total = p_jif->usr + p_jif->nic + p_jif->sys + p_jif->idle
 			+ p_jif->iowait + p_jif->irq + p_jif->softirq + p_jif->steal;
-		/* procps 2.x does not count iowait as busy time */
-		p_jif->busy = p_jif->total - p_jif->idle - p_jif->iowait;
 	}
 
 	return ret;
@@ -604,19 +601,10 @@
 
 static NOINLINE void display_process_list(int lines_rem, int scr_width)
 {
-	enum {
-		BITS_PER_INT = sizeof(int) * 8
-	};
-
 	top_status_t *s;
 	unsigned long total_memory = display_header(scr_width, &lines_rem); /* or use total_vsz? */
-	/* xxx_shift and xxx_scale variables allow us to replace
-	 * expensive divides with multiply and shift */
-	unsigned pmem_shift, pmem_scale, pmem_half;
 #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-	unsigned tmp_unsigned;
-	unsigned pcpu_shift, pcpu_scale, pcpu_half;
-	unsigned busy_jifs;
+	unsigned delta_jifs;
 #endif
 
 	/* what info of the processes is shown */
@@ -638,49 +626,10 @@
 # define SHOW_STAT(name) name
 # define FMT "%4u%%"
 #endif
-	/*
-	 * %VSZ = s->vsz/MemTotal
-	 */
-	pmem_shift = BITS_PER_INT-11;
-	pmem_scale = UPSCALE*(1U<<(BITS_PER_INT-11)) / total_memory;
-	/* s->vsz is in kb. we want (s->vsz * pmem_scale) to never overflow */
-	while (pmem_scale >= 512) {
-		pmem_scale /= 4;
-		pmem_shift -= 2;
-	}
-	pmem_half = (1U << pmem_shift) / (ENABLE_FEATURE_TOP_DECIMALS ? 20 : 2);
-#if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-	busy_jifs = cur_jif.busy - prev_jif.busy;
-	/* This happens if there were lots of short-lived processes
-	 * between two top updates (e.g. compilation) */
-	if (total_pcpu < busy_jifs) total_pcpu = busy_jifs;
 
-	/*
-	 * CPU% = s->pcpu/sum(s->pcpu) * busy_cpu_ticks/total_cpu_ticks
-	 * (pcpu is delta of sys+user time between samples)
-	 */
-	/* (cur_jif.xxx - prev_jif.xxx) and s->pcpu are
-	 * in 0..~64000 range (HZ*update_interval).
-	 * we assume that unsigned is at least 32-bit.
-	 */
-	pcpu_shift = 6;
-	pcpu_scale = UPSCALE*64 * (uint16_t)busy_jifs;
-	if (pcpu_scale == 0)
-		pcpu_scale = 1;
-	while (pcpu_scale < (1U << (BITS_PER_INT-2))) {
-		pcpu_scale *= 4;
-		pcpu_shift += 2;
-	}
-	tmp_unsigned = (uint16_t)(cur_jif.total - prev_jif.total) * total_pcpu;
-	if (tmp_unsigned != 0)
-		pcpu_scale /= tmp_unsigned;
-	/* we want (s->pcpu * pcpu_scale) to never overflow */
-	while (pcpu_scale >= 1024) {
-		pcpu_scale /= 4;
-		pcpu_shift -= 2;
-	}
-	pcpu_half = (1U << pcpu_shift) / (ENABLE_FEATURE_TOP_DECIMALS ? 20 : 2);
-	/* printf(" pmem_scale=%u pcpu_scale=%u ", pmem_scale, pcpu_scale); */
+#if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
+	/* s->pcpu is in jiffies */
+	delta_jifs = cur_jif.total - prev_jif.total;
 #endif
 
 	/* Ok, all preliminary data is ready, go through the list */
@@ -692,9 +641,9 @@
 		char vsz_str_buf[8];
 		unsigned col;
 
-		CALC_STAT(pmem, (s->vsz*pmem_scale + pmem_half) >> pmem_shift);
+		CALC_STAT(pmem, (s->vsz * UPSCALE + total_memory/2) / total_memory);
 #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-		CALC_STAT(pcpu, (s->pcpu*pcpu_scale + pcpu_half) >> pcpu_shift);
+		CALC_STAT(pcpu, (s->pcpu * UPSCALE + delta_jifs/2) / delta_jifs);
 #endif
 
 		smart_ulltoa5(s->vsz, vsz_str_buf, " mgtpezy");

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic