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

List:       busybox-cvs
Subject:    [git commit master 1/1] mpstat: better fix for IRQ counts
From:       vda.linux () googlemail ! com (Denys Vlasenko)
Date:       2010-07-30 11:55:35
Message-ID: 20100730115612.324AF836E4 () busybox ! osuosl ! org
[Download RAW message or body]


commit: http://git.busybox.net/busybox/commit/?id=3fb4a5e6d86e52014502391d8dca25befa4ff9b4
                
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 procps/mpstat.c |   39 ++++++++++++++++++++-------------------
 1 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/procps/mpstat.c b/procps/mpstat.c
index d19abee..1199b98 100644
--- a/procps/mpstat.c
+++ b/procps/mpstat.c
@@ -93,8 +93,9 @@ struct globals {
 	unsigned hz;
 	unsigned cpu_bitmap_len;
 	smallint p_option;
-	smallint header_done;
-	smallint avg_header_done;
+	// 9.0.6 does not do it. Try "mpstat -A 1 2" - headers are repeated!
+	//smallint header_done;
+	//smallint avg_header_done;
 	unsigned char *cpu_bitmap;      /* Bit 0: global, bit 1: 1st proc... */
 	data_t global_uptime[3];
 	data_t per_cpu_uptime[3];
@@ -206,7 +207,7 @@ static void write_irqcpu_stats(struct stats_irqcpu \
*per_cpu_stats[],  printf("\n%-11s  CPU", prev_str);
 	{
 		/* A bit complex code to "buy back" space if one header is too wide.
-		 * Here's how it looks like. BLOCK_IOPOLL eating too much,
+		 * Here's how it looks like. BLOCK_IOPOLL eats too much space,
 		 * and latter headers use smaller width to compensate:
 		 * ...BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s  RCU/s
 		 * ...   2.32      0.00      0.01     17.58      0.14    141.96
@@ -328,13 +329,13 @@ static void write_stats_core(int prev, int current,
 	/* Print CPU stats */
 	if (display_opt(D_CPU)) {
 
-		/* This is done exactly once */
-		if (!G.header_done) {
+		///* This is done exactly once */
+		//if (!G.header_done) {
 			printf("\n%-11s  CPU    %%usr   %%nice    %%sys %%iowait    %%irq   %%soft  \
%%steal  %%guest   %%idle\n",  prev_str
 			);
-			G.header_done = 1;
-		}
+		//	G.header_done = 1;
+		//}
 
 		for (cpu = 0; cpu <= G.cpu_nr; cpu++) {
 			data_t per_cpu_itv;
@@ -389,11 +390,11 @@ static void write_stats_core(int prev, int current,
 	/* Print total number of IRQs per CPU */
 	if (display_opt(D_IRQ_SUM)) {
 
-		/* Print average header, this is done exactly once */
-		if (!G.avg_header_done) {
+		///* Print average header, this is done exactly once */
+		//if (!G.avg_header_done) {
 			printf("\n%-11s  CPU    intr/s\n", prev_str);
-			G.avg_header_done = 1;
-		}
+		//	G.avg_header_done = 1;
+		//}
 
 		for (cpu = 0; cpu <= G.cpu_nr; cpu++) {
 			data_t per_cpu_itv;
@@ -526,13 +527,8 @@ static void get_cpu_statistics(struct stats_cpu *cpu, data_t \
*up, data_t *up0)  static void get_irqs_from_stat(struct stats_irq *irq)
 {
 	FILE *fp;
-	unsigned cpu;
 	char buf[1024];
 
-	for (cpu = 1; cpu <= G.cpu_nr; cpu++) {
-		irq->irq_nr = 0;
-	}
-
 	fp = fopen_for_read(PROCFS_STAT);
 	if (!fp)
 		return;
@@ -565,8 +561,7 @@ static void get_irqs_from_interrupts(const char *fname,
 	int cpu_index[G.cpu_nr];
 	int iindex;
 
-// Moved to get_irqs_from_stat(), which is called once, not twice,
-// unlike get_irqs_from_interrupts().
+// Moved to caller.
 // Otherwise reading of /proc/softirqs
 // was resetting counts to 0 after we painstakingly collected them from
 // /proc/interrupts. Which resulted in:
@@ -756,9 +751,15 @@ static void main_loop(void)
 		if (display_opt(D_IRQ_SUM))
 			get_irqs_from_stat(G.st_irq[current]);
 
-		if (display_opt(D_IRQ_SUM | D_IRQ_CPU))
+		if (display_opt(D_IRQ_SUM | D_IRQ_CPU)) {
+			int cpu;
+			for (cpu = 1; cpu <= G.cpu_nr; cpu++) {
+				G.st_irq[current][cpu].irq_nr = 0;
+			}
+			/* accumulates .irq_nr */
 			get_irqs_from_interrupts(PROCFS_INTERRUPTS, G.st_irqcpu,
 					G.irqcpu_nr, current);
+		}
 
 		if (display_opt(D_SOFTIRQS))
 			get_irqs_from_interrupts(PROCFS_SOFTIRQS,
-- 
1.7.1


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

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