aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-07-30 13:55:35 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-07-30 13:55:35 +0200
commit3fb4a5e6d86e52014502391d8dca25befa4ff9b4 (patch)
tree0ac8d9f613712106b2710033431743fa9b5b64d1
parent9bb0510b9b065cf81ee6f9e4e34bea8a32915eed (diff)
downloadbusybox-w32-3fb4a5e6d86e52014502391d8dca25befa4ff9b4.tar.gz
busybox-w32-3fb4a5e6d86e52014502391d8dca25befa4ff9b4.tar.bz2
busybox-w32-3fb4a5e6d86e52014502391d8dca25befa4ff9b4.zip
mpstat: better fix for IRQ counts
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--procps/mpstat.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/procps/mpstat.c b/procps/mpstat.c
index d19abee97..1199b98dd 100644
--- a/procps/mpstat.c
+++ b/procps/mpstat.c
@@ -93,8 +93,9 @@ struct globals {
93 unsigned hz; 93 unsigned hz;
94 unsigned cpu_bitmap_len; 94 unsigned cpu_bitmap_len;
95 smallint p_option; 95 smallint p_option;
96 smallint header_done; 96 // 9.0.6 does not do it. Try "mpstat -A 1 2" - headers are repeated!
97 smallint avg_header_done; 97 //smallint header_done;
98 //smallint avg_header_done;
98 unsigned char *cpu_bitmap; /* Bit 0: global, bit 1: 1st proc... */ 99 unsigned char *cpu_bitmap; /* Bit 0: global, bit 1: 1st proc... */
99 data_t global_uptime[3]; 100 data_t global_uptime[3];
100 data_t per_cpu_uptime[3]; 101 data_t per_cpu_uptime[3];
@@ -206,7 +207,7 @@ static void write_irqcpu_stats(struct stats_irqcpu *per_cpu_stats[],
206 printf("\n%-11s CPU", prev_str); 207 printf("\n%-11s CPU", prev_str);
207 { 208 {
208 /* A bit complex code to "buy back" space if one header is too wide. 209 /* A bit complex code to "buy back" space if one header is too wide.
209 * Here's how it looks like. BLOCK_IOPOLL eating too much, 210 * Here's how it looks like. BLOCK_IOPOLL eats too much space,
210 * and latter headers use smaller width to compensate: 211 * and latter headers use smaller width to compensate:
211 * ...BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s 212 * ...BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s
212 * ... 2.32 0.00 0.01 17.58 0.14 141.96 213 * ... 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,
328 /* Print CPU stats */ 329 /* Print CPU stats */
329 if (display_opt(D_CPU)) { 330 if (display_opt(D_CPU)) {
330 331
331 /* This is done exactly once */ 332 ///* This is done exactly once */
332 if (!G.header_done) { 333 //if (!G.header_done) {
333 printf("\n%-11s CPU %%usr %%nice %%sys %%iowait %%irq %%soft %%steal %%guest %%idle\n", 334 printf("\n%-11s CPU %%usr %%nice %%sys %%iowait %%irq %%soft %%steal %%guest %%idle\n",
334 prev_str 335 prev_str
335 ); 336 );
336 G.header_done = 1; 337 // G.header_done = 1;
337 } 338 //}
338 339
339 for (cpu = 0; cpu <= G.cpu_nr; cpu++) { 340 for (cpu = 0; cpu <= G.cpu_nr; cpu++) {
340 data_t per_cpu_itv; 341 data_t per_cpu_itv;
@@ -389,11 +390,11 @@ static void write_stats_core(int prev, int current,
389 /* Print total number of IRQs per CPU */ 390 /* Print total number of IRQs per CPU */
390 if (display_opt(D_IRQ_SUM)) { 391 if (display_opt(D_IRQ_SUM)) {
391 392
392 /* Print average header, this is done exactly once */ 393 ///* Print average header, this is done exactly once */
393 if (!G.avg_header_done) { 394 //if (!G.avg_header_done) {
394 printf("\n%-11s CPU intr/s\n", prev_str); 395 printf("\n%-11s CPU intr/s\n", prev_str);
395 G.avg_header_done = 1; 396 // G.avg_header_done = 1;
396 } 397 //}
397 398
398 for (cpu = 0; cpu <= G.cpu_nr; cpu++) { 399 for (cpu = 0; cpu <= G.cpu_nr; cpu++) {
399 data_t per_cpu_itv; 400 data_t per_cpu_itv;
@@ -526,13 +527,8 @@ static void get_cpu_statistics(struct stats_cpu *cpu, data_t *up, data_t *up0)
526static void get_irqs_from_stat(struct stats_irq *irq) 527static void get_irqs_from_stat(struct stats_irq *irq)
527{ 528{
528 FILE *fp; 529 FILE *fp;
529 unsigned cpu;
530 char buf[1024]; 530 char buf[1024];
531 531
532 for (cpu = 1; cpu <= G.cpu_nr; cpu++) {
533 irq->irq_nr = 0;
534 }
535
536 fp = fopen_for_read(PROCFS_STAT); 532 fp = fopen_for_read(PROCFS_STAT);
537 if (!fp) 533 if (!fp)
538 return; 534 return;
@@ -565,8 +561,7 @@ static void get_irqs_from_interrupts(const char *fname,
565 int cpu_index[G.cpu_nr]; 561 int cpu_index[G.cpu_nr];
566 int iindex; 562 int iindex;
567 563
568// Moved to get_irqs_from_stat(), which is called once, not twice, 564// Moved to caller.
569// unlike get_irqs_from_interrupts().
570// Otherwise reading of /proc/softirqs 565// Otherwise reading of /proc/softirqs
571// was resetting counts to 0 after we painstakingly collected them from 566// was resetting counts to 0 after we painstakingly collected them from
572// /proc/interrupts. Which resulted in: 567// /proc/interrupts. Which resulted in:
@@ -756,9 +751,15 @@ static void main_loop(void)
756 if (display_opt(D_IRQ_SUM)) 751 if (display_opt(D_IRQ_SUM))
757 get_irqs_from_stat(G.st_irq[current]); 752 get_irqs_from_stat(G.st_irq[current]);
758 753
759 if (display_opt(D_IRQ_SUM | D_IRQ_CPU)) 754 if (display_opt(D_IRQ_SUM | D_IRQ_CPU)) {
755 int cpu;
756 for (cpu = 1; cpu <= G.cpu_nr; cpu++) {
757 G.st_irq[current][cpu].irq_nr = 0;
758 }
759 /* accumulates .irq_nr */
760 get_irqs_from_interrupts(PROCFS_INTERRUPTS, G.st_irqcpu, 760 get_irqs_from_interrupts(PROCFS_INTERRUPTS, G.st_irqcpu,
761 G.irqcpu_nr, current); 761 G.irqcpu_nr, current);
762 }
762 763
763 if (display_opt(D_SOFTIRQS)) 764 if (display_opt(D_SOFTIRQS))
764 get_irqs_from_interrupts(PROCFS_SOFTIRQS, 765 get_irqs_from_interrupts(PROCFS_SOFTIRQS,