mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-03 01:36:52 +09:00
fix cputime overflow in uptime_proc_show
commit c3e0ef9a29 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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
277a05f83a
commit
3ec3f83aee
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user