diff options
| -rw-r--r-- | kernel/time/tick-sched.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index dc17ffcf1919..87fc34f21db2 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -282,8 +282,31 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 282 | /* Schedule the tick, if we are at least one jiffie off */ | 282 | /* Schedule the tick, if we are at least one jiffie off */ |
| 283 | if ((long)delta_jiffies >= 1) { | 283 | if ((long)delta_jiffies >= 1) { |
| 284 | 284 | ||
| 285 | /* | ||
| 286 | * calculate the expiry time for the next timer wheel | ||
| 287 | * timer | ||
| 288 | */ | ||
| 289 | expires = ktime_add_ns(last_update, tick_period.tv64 * | ||
| 290 | delta_jiffies); | ||
| 291 | |||
| 292 | /* | ||
| 293 | * If this cpu is the one which updates jiffies, then | ||
| 294 | * give up the assignment and let it be taken by the | ||
| 295 | * cpu which runs the tick timer next, which might be | ||
| 296 | * this cpu as well. If we don't drop this here the | ||
| 297 | * jiffies might be stale and do_timer() never | ||
| 298 | * invoked. | ||
| 299 | */ | ||
| 300 | if (cpu == tick_do_timer_cpu) | ||
| 301 | tick_do_timer_cpu = TICK_DO_TIMER_NONE; | ||
| 302 | |||
| 285 | if (delta_jiffies > 1) | 303 | if (delta_jiffies > 1) |
| 286 | cpu_set(cpu, nohz_cpu_mask); | 304 | cpu_set(cpu, nohz_cpu_mask); |
| 305 | |||
| 306 | /* Skip reprogram of event if its not changed */ | ||
| 307 | if (ts->tick_stopped && ktime_equal(expires, dev->next_event)) | ||
| 308 | goto out; | ||
| 309 | |||
| 287 | /* | 310 | /* |
| 288 | * nohz_stop_sched_tick can be called several times before | 311 | * nohz_stop_sched_tick can be called several times before |
| 289 | * the nohz_restart_sched_tick is called. This happens when | 312 | * the nohz_restart_sched_tick is called. This happens when |
| @@ -306,17 +329,6 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 306 | rcu_enter_nohz(); | 329 | rcu_enter_nohz(); |
| 307 | } | 330 | } |
| 308 | 331 | ||
| 309 | /* | ||
| 310 | * If this cpu is the one which updates jiffies, then | ||
| 311 | * give up the assignment and let it be taken by the | ||
| 312 | * cpu which runs the tick timer next, which might be | ||
| 313 | * this cpu as well. If we don't drop this here the | ||
| 314 | * jiffies might be stale and do_timer() never | ||
| 315 | * invoked. | ||
| 316 | */ | ||
| 317 | if (cpu == tick_do_timer_cpu) | ||
| 318 | tick_do_timer_cpu = TICK_DO_TIMER_NONE; | ||
| 319 | |||
| 320 | ts->idle_sleeps++; | 332 | ts->idle_sleeps++; |
| 321 | 333 | ||
| 322 | /* | 334 | /* |
| @@ -332,12 +344,7 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 332 | goto out; | 344 | goto out; |
| 333 | } | 345 | } |
| 334 | 346 | ||
| 335 | /* | 347 | /* Mark expiries */ |
| 336 | * calculate the expiry time for the next timer wheel | ||
| 337 | * timer | ||
| 338 | */ | ||
| 339 | expires = ktime_add_ns(last_update, tick_period.tv64 * | ||
| 340 | delta_jiffies); | ||
| 341 | ts->idle_expires = expires; | 348 | ts->idle_expires = expires; |
| 342 | 349 | ||
| 343 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | 350 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { |
