diff options
| -rw-r--r-- | kernel/time/tick-sched.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 358822ee32d5..59d8762c7e1d 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -150,14 +150,25 @@ static void tick_nohz_update_jiffies(ktime_t now) | |||
| 150 | touch_softlockup_watchdog(); | 150 | touch_softlockup_watchdog(); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | static void tick_nohz_stop_idle(int cpu, ktime_t now) | 153 | /* |
| 154 | * Updates the per cpu time idle statistics counters | ||
| 155 | */ | ||
| 156 | static void update_ts_time_stats(struct tick_sched *ts, ktime_t now) | ||
| 154 | { | 157 | { |
| 155 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); | ||
| 156 | ktime_t delta; | 158 | ktime_t delta; |
| 157 | 159 | ||
| 158 | delta = ktime_sub(now, ts->idle_entrytime); | ||
| 159 | ts->idle_lastupdate = now; | 160 | ts->idle_lastupdate = now; |
| 160 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | 161 | if (ts->idle_active) { |
| 162 | delta = ktime_sub(now, ts->idle_entrytime); | ||
| 163 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | ||
| 164 | } | ||
| 165 | } | ||
| 166 | |||
| 167 | static void tick_nohz_stop_idle(int cpu, ktime_t now) | ||
| 168 | { | ||
| 169 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); | ||
| 170 | |||
| 171 | update_ts_time_stats(ts, now); | ||
| 161 | ts->idle_active = 0; | 172 | ts->idle_active = 0; |
| 162 | 173 | ||
| 163 | sched_clock_idle_wakeup_event(0); | 174 | sched_clock_idle_wakeup_event(0); |
| @@ -165,14 +176,12 @@ static void tick_nohz_stop_idle(int cpu, ktime_t now) | |||
| 165 | 176 | ||
| 166 | static ktime_t tick_nohz_start_idle(struct tick_sched *ts) | 177 | static ktime_t tick_nohz_start_idle(struct tick_sched *ts) |
| 167 | { | 178 | { |
| 168 | ktime_t now, delta; | 179 | ktime_t now; |
| 169 | 180 | ||
| 170 | now = ktime_get(); | 181 | now = ktime_get(); |
| 171 | if (ts->idle_active) { | 182 | |
| 172 | delta = ktime_sub(now, ts->idle_entrytime); | 183 | update_ts_time_stats(ts, now); |
| 173 | ts->idle_lastupdate = now; | 184 | |
| 174 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | ||
| 175 | } | ||
| 176 | ts->idle_entrytime = now; | 185 | ts->idle_entrytime = now; |
| 177 | ts->idle_active = 1; | 186 | ts->idle_active = 1; |
| 178 | sched_clock_idle_sleep_event(); | 187 | sched_clock_idle_sleep_event(); |
