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

Reply via email to