Commit 62c43dd9 authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar

sched_clock: record from last tick

The sched_clock code tries to keep within the gtod time by one tick (jiffy).
The current code mistakenly keeps track of the delta jiffies between
updates of the clock, where the the delta is used to compare with the
number of jiffies that have past since an update of the gtod. The gtod is
updated at each schedule tick not each sched_clock update. After one
jiffy passes the clock is updated fine. But the delta is taken from the
last update so if the next update happens before the next tick the delta
jiffies used will be incorrect.

This patch changes the code to check the delta of jiffies between ticks
and not updates to match the comparison of the updates with the gtod.
Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
Cc: Steven Rostedt <srostedt@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 70ff0555
...@@ -40,7 +40,7 @@ struct sched_clock_data { ...@@ -40,7 +40,7 @@ struct sched_clock_data {
*/ */
raw_spinlock_t lock; raw_spinlock_t lock;
unsigned long prev_jiffies; unsigned long tick_jiffies;
u64 prev_raw; u64 prev_raw;
u64 tick_raw; u64 tick_raw;
u64 tick_gtod; u64 tick_gtod;
...@@ -71,7 +71,7 @@ void sched_clock_init(void) ...@@ -71,7 +71,7 @@ void sched_clock_init(void)
struct sched_clock_data *scd = cpu_sdc(cpu); struct sched_clock_data *scd = cpu_sdc(cpu);
scd->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; scd->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
scd->prev_jiffies = now_jiffies; scd->tick_jiffies = now_jiffies;
scd->prev_raw = 0; scd->prev_raw = 0;
scd->tick_raw = 0; scd->tick_raw = 0;
scd->tick_gtod = ktime_now; scd->tick_gtod = ktime_now;
...@@ -90,7 +90,7 @@ void sched_clock_init(void) ...@@ -90,7 +90,7 @@ void sched_clock_init(void)
static void __update_sched_clock(struct sched_clock_data *scd, u64 now) static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
{ {
unsigned long now_jiffies = jiffies; unsigned long now_jiffies = jiffies;
long delta_jiffies = now_jiffies - scd->prev_jiffies; long delta_jiffies = now_jiffies - scd->tick_jiffies;
u64 clock = scd->clock; u64 clock = scd->clock;
u64 min_clock, max_clock; u64 min_clock, max_clock;
s64 delta = now - scd->prev_raw; s64 delta = now - scd->prev_raw;
...@@ -119,7 +119,6 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now) ...@@ -119,7 +119,6 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now)
clock = min_clock; clock = min_clock;
scd->prev_raw = now; scd->prev_raw = now;
scd->prev_jiffies = now_jiffies;
scd->clock = clock; scd->clock = clock;
} }
...@@ -179,6 +178,7 @@ u64 sched_clock_cpu(int cpu) ...@@ -179,6 +178,7 @@ u64 sched_clock_cpu(int cpu)
void sched_clock_tick(void) void sched_clock_tick(void)
{ {
struct sched_clock_data *scd = this_scd(); struct sched_clock_data *scd = this_scd();
unsigned long now_jiffies = jiffies;
u64 now, now_gtod; u64 now, now_gtod;
if (unlikely(!sched_clock_running)) if (unlikely(!sched_clock_running))
...@@ -196,6 +196,7 @@ void sched_clock_tick(void) ...@@ -196,6 +196,7 @@ void sched_clock_tick(void)
* already observe 1 new jiffy; adding a new tick_gtod to that would * already observe 1 new jiffy; adding a new tick_gtod to that would
* increase the clock 2 jiffies. * increase the clock 2 jiffies.
*/ */
scd->tick_jiffies = now_jiffies;
scd->tick_raw = now; scd->tick_raw = now;
scd->tick_gtod = now_gtod; scd->tick_gtod = now_gtod;
__raw_spin_unlock(&scd->lock); __raw_spin_unlock(&scd->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment