Skip to content

Commit

Permalink
sched_clock: only update deltas with local reads.
Browse files Browse the repository at this point in the history
Reading the CPU clock should try to stay accurate within the CPU.
By reading the CPU clock from another CPU and updating the deltas can
cause unneeded jumps when reading from the local CPU.

This patch changes the code to update the last read TSC only when read
from the local CPU.

Signed-off-by: Steven Rostedt <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: john stultz <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
rostedt authored and Ingo Molnar committed Jul 11, 2008
1 parent 2b8a0cf commit c0c8773
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions kernel/sched_clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ static int check_max(struct sched_clock_data *scd)
* - filter out backward motion
* - use jiffies to generate a min,max window to clip the raw values
*/
static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
static void __update_sched_clock(struct sched_clock_data *scd, u64 now, u64 *time)
{
unsigned long now_jiffies = jiffies;
long delta_jiffies = now_jiffies - scd->tick_jiffies;
Expand Down Expand Up @@ -162,8 +162,12 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
if (unlikely(clock < min_clock))
clock = min_clock;

scd->prev_raw = now;
scd->clock = clock;
if (time)
*time = clock;
else {
scd->prev_raw = now;
scd->clock = clock;
}
}

static void lock_double_clock(struct sched_clock_data *data1,
Expand Down Expand Up @@ -207,15 +211,18 @@ u64 sched_clock_cpu(int cpu)
now -= scd->tick_gtod;

__raw_spin_unlock(&my_scd->lock);

__update_sched_clock(scd, now, &clock);

__raw_spin_unlock(&scd->lock);

} else {
__raw_spin_lock(&scd->lock);
__update_sched_clock(scd, now, NULL);
clock = scd->clock;
__raw_spin_unlock(&scd->lock);
}

__update_sched_clock(scd, now);
clock = scd->clock;

__raw_spin_unlock(&scd->lock);

return clock;
}

Expand All @@ -234,7 +241,7 @@ void sched_clock_tick(void)
now_gtod = ktime_to_ns(ktime_get());

__raw_spin_lock(&scd->lock);
__update_sched_clock(scd, now);
__update_sched_clock(scd, now, NULL);
/*
* update tick_gtod after __update_sched_clock() because that will
* already observe 1 new jiffy; adding a new tick_gtod to that would
Expand Down

0 comments on commit c0c8773

Please sign in to comment.