diff options
| -rw-r--r-- | arch/x86/kernel/irq.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/smp.c | 1 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 9 |
3 files changed, 10 insertions, 2 deletions
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 74656d1d4e30..391206199515 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -244,6 +244,7 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | |||
| 244 | __func__, smp_processor_id(), vector, irq); | 244 | __func__, smp_processor_id(), vector, irq); |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | run_local_timers(); | ||
| 247 | irq_exit(); | 248 | irq_exit(); |
| 248 | 249 | ||
| 249 | set_irq_regs(old_regs); | 250 | set_irq_regs(old_regs); |
| @@ -268,6 +269,7 @@ void smp_generic_interrupt(struct pt_regs *regs) | |||
| 268 | if (generic_interrupt_extension) | 269 | if (generic_interrupt_extension) |
| 269 | generic_interrupt_extension(); | 270 | generic_interrupt_extension(); |
| 270 | 271 | ||
| 272 | run_local_timers(); | ||
| 271 | irq_exit(); | 273 | irq_exit(); |
| 272 | 274 | ||
| 273 | set_irq_regs(old_regs); | 275 | set_irq_regs(old_regs); |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index ec1de97600e7..d915d956e66d 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
| @@ -198,6 +198,7 @@ void smp_reschedule_interrupt(struct pt_regs *regs) | |||
| 198 | { | 198 | { |
| 199 | ack_APIC_irq(); | 199 | ack_APIC_irq(); |
| 200 | inc_irq_stat(irq_resched_count); | 200 | inc_irq_stat(irq_resched_count); |
| 201 | run_local_timers(); | ||
| 201 | /* | 202 | /* |
| 202 | * KVM uses this interrupt to force a cpu out of guest mode | 203 | * KVM uses this interrupt to force a cpu out of guest mode |
| 203 | */ | 204 | */ |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index e0f59a21c061..89aed5933ed4 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 231 | if (!inidle && !ts->inidle) | 231 | if (!inidle && !ts->inidle) |
| 232 | goto end; | 232 | goto end; |
| 233 | 233 | ||
| 234 | /* | ||
| 235 | * Set ts->inidle unconditionally. Even if the system did not | ||
| 236 | * switch to NOHZ mode the cpu frequency governers rely on the | ||
| 237 | * update of the idle time accounting in tick_nohz_start_idle(). | ||
| 238 | */ | ||
| 239 | ts->inidle = 1; | ||
| 240 | |||
| 234 | now = tick_nohz_start_idle(ts); | 241 | now = tick_nohz_start_idle(ts); |
| 235 | 242 | ||
| 236 | /* | 243 | /* |
| @@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 248 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) | 255 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) |
| 249 | goto end; | 256 | goto end; |
| 250 | 257 | ||
| 251 | ts->inidle = 1; | ||
| 252 | |||
| 253 | if (need_resched()) | 258 | if (need_resched()) |
| 254 | goto end; | 259 | goto end; |
| 255 | 260 | ||
