cputime64_t total_idle_nsecs, tmp_idle_nsecs;
cputime64_t total_wall_nsecs, tmp_wall_nsecs;
struct cpu_dbs_info_s *j_dbs_info;
- unsigned long tmp_load;
+ unsigned long tmp_load, tmp_wall_msecs, tmp_idle_msecs;
j_dbs_info = &per_cpu(cpu_dbs_info, j);
total_idle_nsecs = idletime[j];
j_dbs_info->prev_cpu_wall = total_wall_nsecs;
j_dbs_info->prev_cpu_idle = total_idle_nsecs;
- tmp_load = (100 * (tmp_wall_nsecs - tmp_idle_nsecs)) /
- tmp_wall_nsecs;
+ /* Convert nsecs to msecs and clamp times to sane values. */
+ do_div(tmp_wall_nsecs, 1000000);
+ tmp_wall_msecs = tmp_wall_nsecs;
+ do_div(tmp_idle_nsecs, 1000000);
+ tmp_idle_msecs = tmp_idle_nsecs;
+ if (tmp_wall_msecs == 0)
+ tmp_wall_msecs = 1;
+ if (tmp_idle_msecs < tmp_wall_msecs)
+ tmp_idle_msecs = tmp_wall_msecs;
+
+ tmp_load = (100 * (tmp_wall_msecs - tmp_idle_msecs)) /
+ tmp_wall_msecs;
load = max(load, min(100, (int) tmp_load));
}
return load;