diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched_clock.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index 55fca1e9e12a..ee7cce5029ce 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c | |||
| @@ -124,7 +124,7 @@ static int check_max(struct sched_clock_data *scd) | |||
| 124 | * - filter out backward motion | 124 | * - filter out backward motion |
| 125 | * - use jiffies to generate a min,max window to clip the raw values | 125 | * - use jiffies to generate a min,max window to clip the raw values |
| 126 | */ | 126 | */ |
| 127 | static void __update_sched_clock(struct sched_clock_data *scd, u64 now) | 127 | static void __update_sched_clock(struct sched_clock_data *scd, u64 now, u64 *time) |
| 128 | { | 128 | { |
| 129 | unsigned long now_jiffies = jiffies; | 129 | unsigned long now_jiffies = jiffies; |
| 130 | long delta_jiffies = now_jiffies - scd->tick_jiffies; | 130 | long delta_jiffies = now_jiffies - scd->tick_jiffies; |
| @@ -162,8 +162,12 @@ static void __update_sched_clock(struct sched_clock_data *scd, u64 now) | |||
| 162 | if (unlikely(clock < min_clock)) | 162 | if (unlikely(clock < min_clock)) |
| 163 | clock = min_clock; | 163 | clock = min_clock; |
| 164 | 164 | ||
| 165 | scd->prev_raw = now; | 165 | if (time) |
| 166 | scd->clock = clock; | 166 | *time = clock; |
| 167 | else { | ||
| 168 | scd->prev_raw = now; | ||
| 169 | scd->clock = clock; | ||
| 170 | } | ||
| 167 | } | 171 | } |
| 168 | 172 | ||
| 169 | static void lock_double_clock(struct sched_clock_data *data1, | 173 | static void lock_double_clock(struct sched_clock_data *data1, |
| @@ -207,15 +211,18 @@ u64 sched_clock_cpu(int cpu) | |||
| 207 | now -= scd->tick_gtod; | 211 | now -= scd->tick_gtod; |
| 208 | 212 | ||
| 209 | __raw_spin_unlock(&my_scd->lock); | 213 | __raw_spin_unlock(&my_scd->lock); |
| 214 | |||
| 215 | __update_sched_clock(scd, now, &clock); | ||
| 216 | |||
| 217 | __raw_spin_unlock(&scd->lock); | ||
| 218 | |||
| 210 | } else { | 219 | } else { |
| 211 | __raw_spin_lock(&scd->lock); | 220 | __raw_spin_lock(&scd->lock); |
| 221 | __update_sched_clock(scd, now, NULL); | ||
| 222 | clock = scd->clock; | ||
| 223 | __raw_spin_unlock(&scd->lock); | ||
| 212 | } | 224 | } |
| 213 | 225 | ||
| 214 | __update_sched_clock(scd, now); | ||
| 215 | clock = scd->clock; | ||
| 216 | |||
| 217 | __raw_spin_unlock(&scd->lock); | ||
| 218 | |||
| 219 | return clock; | 226 | return clock; |
| 220 | } | 227 | } |
| 221 | 228 | ||
| @@ -234,7 +241,7 @@ void sched_clock_tick(void) | |||
| 234 | now_gtod = ktime_to_ns(ktime_get()); | 241 | now_gtod = ktime_to_ns(ktime_get()); |
| 235 | 242 | ||
| 236 | __raw_spin_lock(&scd->lock); | 243 | __raw_spin_lock(&scd->lock); |
| 237 | __update_sched_clock(scd, now); | 244 | __update_sched_clock(scd, now, NULL); |
| 238 | /* | 245 | /* |
| 239 | * update tick_gtod after __update_sched_clock() because that will | 246 | * update tick_gtod after __update_sched_clock() because that will |
| 240 | * already observe 1 new jiffy; adding a new tick_gtod to that would | 247 | * already observe 1 new jiffy; adding a new tick_gtod to that would |
