Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

procfs: do not confuse jiffies with cputime64_t

Commit 2a95ea6c0d129b4 ("procfs: do not overflow get_{idle,iowait}_time
for nohz") did not take into account that one some architectures jiffies
and cputime use different units.

This causes get_idle_time() to return numbers in the wrong units, making
the idle time fields in /proc/stat wrong.

Instead of converting the usec value returned by
get_cpu_{idle,iowait}_time_us to units of jiffies, use the new function
usecs_to_cputime64 to convert it to the correct unit of cputime64_t.

Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Artem S. Tashkinov" <t.artem@mailcity.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Andreas Schwab and committed by
Linus Torvalds
34845636 e26a5114

+8 -2
+1
arch/ia64/include/asm/cputime.h
··· 60 60 */ 61 61 #define cputime_to_usecs(__ct) ((__ct) / NSEC_PER_USEC) 62 62 #define usecs_to_cputime(__usecs) ((__usecs) * NSEC_PER_USEC) 63 + #define usecs_to_cputime64(__usecs) usecs_to_cputime(__usecs) 63 64 64 65 /* 65 66 * Convert cputime <-> seconds
+2
arch/powerpc/include/asm/cputime.h
··· 150 150 return ct; 151 151 } 152 152 153 + #define usecs_to_cputime64(us) usecs_to_cputime(us) 154 + 153 155 /* 154 156 * Convert cputime <-> seconds 155 157 */
+2
arch/s390/include/asm/cputime.h
··· 87 87 return (cputime_t) m * 4096; 88 88 } 89 89 90 + #define usecs_to_cputime64(m) usecs_to_cputime(m) 91 + 90 92 /* 91 93 * Convert cputime to milliseconds and back. 92 94 */
+2 -2
fs/proc/stat.c
··· 32 32 idle = kstat_cpu(cpu).cpustat.idle; 33 33 idle = cputime64_add(idle, arch_idle_time(cpu)); 34 34 } else 35 - idle = nsecs_to_jiffies64(1000 * idle_time); 35 + idle = usecs_to_cputime64(idle_time); 36 36 37 37 return idle; 38 38 } ··· 46 46 /* !NO_HZ so we can rely on cpustat.iowait */ 47 47 iowait = kstat_cpu(cpu).cpustat.iowait; 48 48 else 49 - iowait = nsecs_to_jiffies64(1000 * iowait_time); 49 + iowait = usecs_to_cputime64(iowait_time); 50 50 51 51 return iowait; 52 52 }
+1
include/asm-generic/cputime.h
··· 40 40 */ 41 41 #define cputime_to_usecs(__ct) jiffies_to_usecs(__ct) 42 42 #define usecs_to_cputime(__msecs) usecs_to_jiffies(__msecs) 43 + #define usecs_to_cputime64(__msecs) nsecs_to_jiffies64((__msecs) * 1000) 43 44 44 45 /* 45 46 * Convert cputime to seconds and back.