Hello Amit/Daniel,
I think there is a bug in idlestat due to which it reports wrong irq counts in output.
Log is 9.998478 secs long with 1518 events clusterA@state hits total(us) avg(us) min(us) max(us) C6-SNB 455 9921571.00 21805.65 0.00 176303.00 cpu0@state hits total(us) avg(us) min(us) max(us) C1-SNB 10 2032.00 203.20 27.00 1219.00 C3-SNB 2 5909.00 2954.50 161.00 5748.00 C6-SNB 320 9978546.00 31182.96 48.00 237467.00 cpu0 wakeups name count irq040 eth0 150 cpu1@state hits total(us) avg(us) min(us) max(us) C6-SNB 140 9981689.00 71297.78 80.00 311045.00 cpu1 wakeups name count irq018 ata_piix 19 cpu2@state hits total(us) avg(us) min(us) max(us) C6-SNB 87 9995015.00 114885.23 11935.00 323889.00 cpu2 wakeups name count cpu3@state hits total(us) avg(us) min(us) max(us) C1-SNB 3 383.00 127.67 122.00 139.00 C6-SNB 97 9954601.00 102624.75 51.00 323890.00 cpu3 wakeups name count
from my trace output file -
grep 'irq=40' /tmp/trace | wc -l returns 308. Half should be the irq count = 154. grep 'irq=18' /tmp/trace | wc -l returns 80. Half should be irq count = 40.
I have made a patch to fix the issue below.
Below check causes early unwanted return from store_irq() function. In fact, the whole 'wakeirq' member seems unnecessary, hence the related code.
if (cstates->wakeirq != NULL) return 0;
Would you please check?
diff --git a/idlestat.c b/idlestat.c index 5e8f8d5..d4ea859 100644 --- a/idlestat.c +++ b/idlestat.c @@ -654,7 +654,6 @@ static int store_data(double time, int state, int cpu, cstates->cstate[state].data = data; cstates->cstate_max = MAX(cstates->cstate_max, state); cstates->last_cstate = state; - cstates->wakeirq = NULL;
/* update P-state stats if supported */ if (pstate) @@ -684,9 +683,6 @@ static int store_irq(int cpu, int irqid, char *irqname, struct wakeup_irq *irqinfo; struct wakeup_info *wakeinfo = &cstates->wakeinfo;
- if (cstates->wakeirq != NULL) - return 0; - irqinfo = find_irqinfo(wakeinfo, irqid); if (NULL == irqinfo) { irqinfo = realloc(wakeinfo->irqinfo, @@ -705,8 +701,6 @@ static int store_irq(int cpu, int irqid, char *irqname,
irqinfo->count++;
- cstates->wakeirq = irqinfo; - return 0; }
diff --git a/idlestat.h b/idlestat.h index 1977ab4..bb27e3a 100644 --- a/idlestat.h +++ b/idlestat.h @@ -76,7 +76,6 @@ struct cpuidle_cstates { struct wakeup_info wakeinfo; int last_cstate; int cstate_max; - struct wakeup_irq *wakeirq; };
struct cpufreq_pstate {
-- Thanks, -Meraj