Hi Meraj, We only want to count the wakeup sources (eg: irq/ipi etc *). Hence the total count for an irq /ipi can differ.
* Note there can be spurious wakeups in some systems. ie: core exiting idle without an irq. Thanks Sandeep On 20 June 2014 13:58, Mohammad Merajul Islam Molla <meraj.eni...@gmail.com> wrote: > 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 > > _______________________________________________ > linaro-dev mailing list > linaro-dev@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/linaro-dev >
_______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev