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.enigma@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