Skip to content

Commit

Permalink
cpufreq: speedstep-lib: Use monotonic clock
Browse files Browse the repository at this point in the history
Wall time obtained from do_gettimeofday is susceptible to sudden jumps due to
user setting the time or due to NTP.

Monotonic time is constantly increasing time better suited for comparing two
timestamps.

Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Abhilash Jindal authored and Rafael J. Wysocki committed Sep 1, 2015
1 parent 309d063 commit 72e624d
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions drivers/cpufreq/speedstep-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
unsigned int prev_speed;
unsigned int ret = 0;
unsigned long flags;
struct timeval tv1, tv2;
ktime_t tv1, tv2;

if ((!processor) || (!low_speed) || (!high_speed) || (!set_state))
return -EINVAL;
Expand Down Expand Up @@ -415,14 +415,14 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,

/* start latency measurement */
if (transition_latency)
do_gettimeofday(&tv1);
tv1 = ktime_get();

/* switch to high state */
set_state(SPEEDSTEP_HIGH);

/* end latency measurement */
if (transition_latency)
do_gettimeofday(&tv2);
tv2 = ktime_get();

*high_speed = speedstep_get_frequency(processor);
if (!*high_speed) {
Expand All @@ -442,8 +442,7 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
set_state(SPEEDSTEP_LOW);

if (transition_latency) {
*transition_latency = (tv2.tv_sec - tv1.tv_sec) * USEC_PER_SEC +
tv2.tv_usec - tv1.tv_usec;
*transition_latency = ktime_to_us(ktime_sub(tv2, tv1));
pr_debug("transition latency is %u uSec\n", *transition_latency);

/* convert uSec to nSec and add 20% for safety reasons */
Expand Down

0 comments on commit 72e624d

Please sign in to comment.