2013-09-07 16:35:17

by Frederic Weisbecker

[permalink] [raw]
Subject: [PATCH] cpufreq: Fix wrong time unit conversion

The time spent by a CPU under a given frequency is stored in jiffies unit
in the cpu var cpufreq_stats_table->time_in_state[i], i being the index of
the frequency.

This is what is displayed in the following file on the right column:

cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
2301000 19835820
2300000 3172
[...]

Now cpufreq converts this jiffies unit delta to clock_t before returning it
to the user as in the above file. And that conversion is achieved using the API
cputime64_to_clock_t().

Although it accidentally works on traditional tick based cputime accounting, where
cputime_t maps directly to jiffies, it doesn't work with other types of cputime
accounting such as CONFIG_VIRT_CPU_ACCOUNTING_* where cputime_t can map to nsecs
or any granularity preffered by the architecture.

For example we get a buggy zero delta on full dyntick configurations:

cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
2301000 0
2300000 0
[...]

Fix this with using the proper jiffies_64_t to clock_t conversion.

Reported-by: Carsten Emde <[email protected]>
Tested-by: Carsten Emde <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
Cc: Carsten Emde <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Clark Williams <[email protected]>
Cc: Sebastian Andrzej Siewior <[email protected]>
Cc: Paul E. McKenney <[email protected]>
---
drivers/cpufreq/cpufreq_stats.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
index d37568c..10e6138 100644
--- a/drivers/cpufreq/cpufreq_stats.c
+++ b/drivers/cpufreq/cpufreq_stats.c
@@ -81,7 +81,7 @@ static ssize_t show_time_in_state(struct cpufreq_policy *policy, char *buf)
for (i = 0; i < stat->state_num; i++) {
len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i],
(unsigned long long)
- cputime64_to_clock_t(stat->time_in_state[i]));
+ jiffies_64_to_clock_t(stat->time_in_state[i]));
}
return len;
}
--
1.7.5.4


2013-09-07 19:02:38

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sat, Sep 07, 2013 at 06:35:08PM +0200, Frederic Weisbecker wrote:
> The time spent by a CPU under a given frequency is stored in jiffies unit
> in the cpu var cpufreq_stats_table->time_in_state[i], i being the index of
> the frequency.
>
> This is what is displayed in the following file on the right column:
>
> cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
> 2301000 19835820
> 2300000 3172
> [...]
>
> Now cpufreq converts this jiffies unit delta to clock_t before returning it
> to the user as in the above file. And that conversion is achieved using the API
> cputime64_to_clock_t().
>
> Although it accidentally works on traditional tick based cputime accounting, where
> cputime_t maps directly to jiffies, it doesn't work with other types of cputime
> accounting such as CONFIG_VIRT_CPU_ACCOUNTING_* where cputime_t can map to nsecs
> or any granularity preffered by the architecture.
>
> For example we get a buggy zero delta on full dyntick configurations:
>
> cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
> 2301000 0
> 2300000 0
> [...]
>
> Fix this with using the proper jiffies_64_t to clock_t conversion.
>
> Reported-by: Carsten Emde <[email protected]>
> Tested-by: Carsten Emde <[email protected]>
> Signed-off-by: Frederic Weisbecker <[email protected]>
> Cc: Carsten Emde <[email protected]>
> Cc: Thomas Gleixner <[email protected]>
> Cc: Clark Williams <[email protected]>
> Cc: Sebastian Andrzej Siewior <[email protected]>
> Cc: Paul E. McKenney <[email protected]>

Good catch!

Acked-by: Paul E. McKenney <[email protected]>

> ---
> drivers/cpufreq/cpufreq_stats.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
> index d37568c..10e6138 100644
> --- a/drivers/cpufreq/cpufreq_stats.c
> +++ b/drivers/cpufreq/cpufreq_stats.c
> @@ -81,7 +81,7 @@ static ssize_t show_time_in_state(struct cpufreq_policy *policy, char *buf)
> for (i = 0; i < stat->state_num; i++) {
> len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i],
> (unsigned long long)
> - cputime64_to_clock_t(stat->time_in_state[i]));
> + jiffies_64_to_clock_t(stat->time_in_state[i]));
> }
> return len;
> }
> --
> 1.7.5.4
>

2013-09-07 19:59:54

by Andreas Schwab

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.

Andreas.

--
Andreas Schwab, [email protected]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."

2013-09-07 21:44:14

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Saturday, September 07, 2013 12:02:26 PM Paul E. McKenney wrote:
> On Sat, Sep 07, 2013 at 06:35:08PM +0200, Frederic Weisbecker wrote:
> > The time spent by a CPU under a given frequency is stored in jiffies unit
> > in the cpu var cpufreq_stats_table->time_in_state[i], i being the index of
> > the frequency.
> >
> > This is what is displayed in the following file on the right column:
> >
> > cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
> > 2301000 19835820
> > 2300000 3172
> > [...]
> >
> > Now cpufreq converts this jiffies unit delta to clock_t before returning it
> > to the user as in the above file. And that conversion is achieved using the API
> > cputime64_to_clock_t().
> >
> > Although it accidentally works on traditional tick based cputime accounting, where
> > cputime_t maps directly to jiffies, it doesn't work with other types of cputime
> > accounting such as CONFIG_VIRT_CPU_ACCOUNTING_* where cputime_t can map to nsecs
> > or any granularity preffered by the architecture.
> >
> > For example we get a buggy zero delta on full dyntick configurations:
> >
> > cat /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state
> > 2301000 0
> > 2300000 0
> > [...]
> >
> > Fix this with using the proper jiffies_64_t to clock_t conversion.
> >
> > Reported-by: Carsten Emde <[email protected]>
> > Tested-by: Carsten Emde <[email protected]>
> > Signed-off-by: Frederic Weisbecker <[email protected]>
> > Cc: Carsten Emde <[email protected]>
> > Cc: Thomas Gleixner <[email protected]>
> > Cc: Clark Williams <[email protected]>
> > Cc: Sebastian Andrzej Siewior <[email protected]>
> > Cc: Paul E. McKenney <[email protected]>
>
> Good catch!
>
> Acked-by: Paul E. McKenney <[email protected]>

Applied, will push for 3.12-rc1.

Thanks Frederic!

>
> > ---
> > drivers/cpufreq/cpufreq_stats.c | 2 +-
> > 1 files changed, 1 insertions(+), 1 deletions(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
> > index d37568c..10e6138 100644
> > --- a/drivers/cpufreq/cpufreq_stats.c
> > +++ b/drivers/cpufreq/cpufreq_stats.c
> > @@ -81,7 +81,7 @@ static ssize_t show_time_in_state(struct cpufreq_policy *policy, char *buf)
> > for (i = 0; i < stat->state_num; i++) {
> > len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i],
> > (unsigned long long)
> > - cputime64_to_clock_t(stat->time_in_state[i]));
> > + jiffies_64_to_clock_t(stat->time_in_state[i]));
> > }
> > return len;
> > }
>
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

2013-09-08 01:57:17

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sat, Sep 07, 2013 at 09:59:38PM +0200, Andreas Schwab wrote:
> See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.

Does look quite similar, now that you mention it.

Perhaps if Frederic has not already sent his patch he could add your
Signed-off-by to his patch?

Thanx, Paul

2013-09-08 10:26:03

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sat, Sep 07, 2013 at 09:59:38PM +0200, Andreas Schwab wrote:
> See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.
>
> Andreas.

Ah I missed it.

Raphael, if it is not too late, may be you could still set Andreas as the original author?

Thanks.

>
> --
> Andreas Schwab, [email protected]
> GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
> "And now for something completely different."

2013-09-08 11:38:50

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sunday, September 08, 2013 12:25:57 PM Frederic Weisbecker wrote:
> On Sat, Sep 07, 2013 at 09:59:38PM +0200, Andreas Schwab wrote:
> > See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.
> >
> > Andreas.
>
> Ah I missed it.
>
> Raphael, if it is not too late, may be you could still set Andreas as the original author?

Done.

Thanks,
Rafael

2013-09-08 11:42:16

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sunday, September 08, 2013 01:49:42 PM Rafael J. Wysocki wrote:
> On Sunday, September 08, 2013 12:25:57 PM Frederic Weisbecker wrote:
> > On Sat, Sep 07, 2013 at 09:59:38PM +0200, Andreas Schwab wrote:
> > > See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.
> > >
> > > Andreas.
> >
> > Ah I missed it.
> >
> > Raphael, if it is not too late, may be you could still set Andreas as the original author?
>
> Done.

BTW, CCing power management patches to [email protected] helps a bit,
because I can see them in patchwork then and that makes overlooking them or
forgetting about them much less likely.

Thanks,
Rafael

2013-09-08 12:09:10

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix wrong time unit conversion

On Sun, Sep 08, 2013 at 01:53:13PM +0200, Rafael J. Wysocki wrote:
> On Sunday, September 08, 2013 01:49:42 PM Rafael J. Wysocki wrote:
> > On Sunday, September 08, 2013 12:25:57 PM Frederic Weisbecker wrote:
> > > On Sat, Sep 07, 2013 at 09:59:38PM +0200, Andreas Schwab wrote:
> > > > See also <http://permalink.gmane.org/gmane.linux.kernel.cpufreq/11672>.
> > > >
> > > > Andreas.
> > >
> > > Ah I missed it.
> > >
> > > Raphael, if it is not too late, may be you could still set Andreas as the original author?
> >
> > Done.
>
> BTW, CCing power management patches to [email protected] helps a bit,
> because I can see them in patchwork then and that makes overlooking them or
> forgetting about them much less likely.

Ok, I'll do that next time.

Thanks.