powerpc: fix wrong divisor in usecs_to_cputime
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 powerpc: fix wrong divisor in usecs_to_cputime
Commit d57af9b (taskstats: use real microsecond granularity for CPU times) renamed msecs_to_cputime to usecs_to_cputime, but failed to update all numbers on the way. This causes nonsensical cpu idle/iowait values to be displayed in /proc/stat (the only user of usecs_to_cputime so far).
This also renames __cputime_msec_factor to __cputime_usec_factor, adapting its value and using it directly in cputime_to_usecs instead of doing two multiplications.
--- arch/powerpc/include/asm/cputime.h | 6 +++--- arch/powerpc/kernel/time.c | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-)
arch/powerpc/include/asm/cputime.h +3 -3
@@ -126,11 +126,11 @@ static inline u64 cputime64_to_jiffies64(const cputime_t ct)/* * Convert cputime <-> microseconds */ -extern u64 __cputime_msec_factor; +extern u64 __cputime_usec_factor;static inline unsigned long cputime_to_usecs (const cputime_t ct) { -return mulhdu (ct, __cputime_msec_factor) *USEC_PER_MSEC ; +return mulhdu (ct, __cputime_usec_factor); }static inline cputime_t usecs_to_cputime (const unsigned long us)
@@ -143,7 +143,7 @@ static inline cputime_t usecs_to_cputime(const unsigned long us) sec = us /1000000 ;if (ct) { ct *= tb_ticks_per_sec; -do_div (ct,1000 ); +do_div (ct,1000000 ); }if (sec) ct += (cputime_t ) sec * tb_ticks_per_sec;
arch/powerpc/kernel/time.c +5 -5
@@ -168,13 +168,13 @@ EXPORT_SYMBOL_GPL(ppc_tb_freq);#ifdef CONFIG_VIRT_CPU_ACCOUNTING /* * Factors for converting from cputime_t (timebase ticks) to -* jiffies, milliseconds, seconds, and clock_t (1/USER_HZ seconds). +* jiffies, microseconds, seconds, and clock_t (1/USER_HZ seconds). * These are all stored as 0.64 fixed-point binary fractions. */ u64 __cputime_jiffies_factor;EXPORT_SYMBOL (__cputime_jiffies_factor); -u64 __cputime_msec_factor; -EXPORT_SYMBOL (__cputime_msec_factor); +u64 __cputime_usec_factor; +EXPORT_SYMBOL (__cputime_usec_factor);u64 __cputime_sec_factor;EXPORT_SYMBOL (__cputime_sec_factor);u64 __cputime_clockt_factor;
@@ -192,8 +192,8 @@ static void calc_cputime_factors(void)div128_by_32 (HZ ,0 , tb_ticks_per_sec, &res); __cputime_jiffies_factor = res.result_low; -div128_by_32 (1000 ,0 , tb_ticks_per_sec, &res); - __cputime_msec_factor = res.result_low; +div128_by_32 (1000000 ,0 , tb_ticks_per_sec, &res); + __cputime_usec_factor = res.result_low;div128_by_32 (1 ,0 , tb_ticks_per_sec, &res); __cputime_sec_factor = res.result_low;div128_by_32 (USER_HZ ,0 , tb_ticks_per_sec, &res);
Signature · 7 lines
1.7.8 -- Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Hi Andreas,
Quoted 9 lines
Commit d57af9b (taskstats: use real microsecond granularity for CPU times) renamed
msecs_to_cputimetousecs_to_cputime, but failed to update all numbers on the way. This causes nonsensical cpu idle/iowait values to be displayed in/proc/stat(the only user ofusecs_to_cputimeso far).This also renames
__cputime_msec_factorto__cputime_usec_factor, adapting its value and using it directly incputime_to_usecsinstead of doing two multiplications.
Thanks for finding this! I noticed the strange behaviour yesterday and was just about to investigate.
Can I suggest we add:
so it will make it back into the stable trees?
Anton
Quoted 1 line
Signed-off-by Andreas Schwab <[email protected]>
FWIW:
Quoted 64 lines
--- arch/powerpc/include/asm/cputime.h | 6 +++--- arch/powerpc/kernel/time.c | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-)(quoted diff) +0
-0
b/arch/powerpc/include/asm/cputime.hindex 1cf20bd..33a3580 100644arch/powerpc/include/asm/cputime.h +0
-0@@ -126,11 +126,11 @@ static inline u64 cputime64_to_jiffies64(const
cputime_tct) /*
* Convert cputime <-> microseconds
*/arch/powerpc/include/asm/cputime.h +3
-3-extern u64 __cputime_msec_factor; +extern u64 __cputime_usec_factor;static inline unsigned long cputime_to_usecs (const cputime_t ct) { -return mulhdu (ct, __cputime_msec_factor) *USEC_PER_MSEC ; +return mulhdu (ct, __cputime_usec_factor); }static inline cputime_t usecs_to_cputime (const unsigned long us)@@ -143,7 +143,7 @@ static inline cputime_t usecs_to_cputime(const unsigned long us) sec = us / 1000000;if (ct) { ct *= tb_ticks_per_sec; -do_div (ct,1000 ); +do_div (ct,1000000 ); }if (sec) ct += (cputime_t ) sec * tb_ticks_per_sec;arch/powerpc/kernel/time.c +5
-5@@ -168,13 +168,13 @@ EXPORT_SYMBOL_GPL(ppc_tb_freq);#ifdef CONFIG_VIRT_CPU_ACCOUNTING /* * Factors for converting from cputime_t (timebase ticks) to -* jiffies, milliseconds, seconds, and clock_t (1/USER_HZ seconds). +* jiffies, microseconds, seconds, and clock_t (1/USER_HZ seconds). * These are all stored as 0.64 fixed-point binary fractions. */ u64 __cputime_jiffies_factor;EXPORT_SYMBOL (__cputime_jiffies_factor); -u64 __cputime_msec_factor; -EXPORT_SYMBOL (__cputime_msec_factor); +u64 __cputime_usec_factor; +EXPORT_SYMBOL (__cputime_usec_factor);u64 __cputime_sec_factor;EXPORT_SYMBOL (__cputime_sec_factor);u64 __cputime_clockt_factor;@@ -192,8 +192,8 @@ static void calc_cputime_factors(void)div128_by_32 (HZ ,0 , tb_ticks_per_sec, &res); __cputime_jiffies_factor = res.result_low; -div128_by_32 (1000 ,0 , tb_ticks_per_sec, &res); - __cputime_msec_factor = res.result_low; +div128_by_32 (1000000 ,0 , tb_ticks_per_sec, &res); + __cputime_usec_factor = res.result_low;div128_by_32 (1 ,0 , tb_ticks_per_sec, &res); __cputime_sec_factor = res.result_low;div128_by_32 (USER_HZ ,0 , tb_ticks_per_sec, &res);
Quoted 12 lines · Anton Blanchard
Hi Andreas,
Quoted 9 lines
Commit d57af9b (taskstats: use real microsecond granularity for CPU times) renamed
msecs_to_cputimetousecs_to_cputime, but failed to update all numbers on the way. This causes nonsensical cpu idle/iowait values to be displayed in/proc/stat(the only user ofusecs_to_cputimeso far).This also renames
__cputime_msec_factorto__cputime_usec_factor, adapting its value and using it directly incputime_to_usecsinstead of doing two multiplications.
Quoted 8 lines
Thanks for finding this! I noticed the strange behaviour yesterday and was just about to investigate.
Can I suggest we add:
Cc <[email protected]> [2.6.37+]so it will make it back into the stable trees?
There is no user of usecs_to_cputime before 3.2-rc1, so it wouldn't have any effect for older versions.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Hi Andreas,
Quoted 2 lines
There is no user of
usecs_to_cputimebefore 3.2-rc1, so it wouldn't have any effect for older versions.
Great, that explains why I only noticed it last week :)
Anton