diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-12-15 14:56:10 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2012-01-25 17:24:53 -0800 |
commit | 3ec3f83aee534f732fd7012ff6c04776952e47fd (patch) | |
tree | 5de4f91d61a4d454eefa352ff18716a5dd0a055c | |
parent | 277a05f83af8c82291cf5f2ad0c2dd1aa6f29de7 (diff) | |
download | lwn-3ec3f83aee534f732fd7012ff6c04776952e47fd.tar.gz lwn-3ec3f83aee534f732fd7012ff6c04776952e47fd.zip |
fix cputime overflow in uptime_proc_show
commit c3e0ef9a298e028a82ada28101ccd5cf64d209ee upstream.
For 32-bit architectures using standard jiffies the idletime calculation
in uptime_proc_show will quickly overflow. It takes (2^32 / HZ) seconds
of idle-time, or e.g. 12.45 days with no load on a quad-core with HZ=1000.
Switch to 64-bit calculations.
Cc: Michael Abbott <michael.abbott@diamond.ac.uk>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | fs/proc/uptime.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c index 766b1d456050..29166ecd03ae 100644 --- a/fs/proc/uptime.c +++ b/fs/proc/uptime.c @@ -11,15 +11,20 @@ static int uptime_proc_show(struct seq_file *m, void *v) { struct timespec uptime; struct timespec idle; + cputime64_t idletime; + u64 nsec; + u32 rem; int i; - cputime_t idletime = cputime_zero; + idletime = 0; for_each_possible_cpu(i) idletime = cputime64_add(idletime, kstat_cpu(i).cpustat.idle); do_posix_clock_monotonic_gettime(&uptime); monotonic_to_bootbased(&uptime); - cputime_to_timespec(idletime, &idle); + nsec = cputime64_to_jiffies64(idletime) * TICK_NSEC; + idle.tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem); + idle.tv_nsec = rem; seq_printf(m, "%lu.%02lu %lu.%02lu\n", (unsigned long) uptime.tv_sec, (uptime.tv_nsec / (NSEC_PER_SEC / 100)), |