Commit 7c1632ba authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'timers-fixes-for-linus' of...

Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, timers: Check for pending timers after (device) interrupts
  NOHZ: update idle state also when NOHZ is inactive
parents a888f96a 9bcbdd9c
...@@ -244,6 +244,7 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs) ...@@ -244,6 +244,7 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
__func__, smp_processor_id(), vector, irq); __func__, smp_processor_id(), vector, irq);
} }
run_local_timers();
irq_exit(); irq_exit();
set_irq_regs(old_regs); set_irq_regs(old_regs);
...@@ -268,6 +269,7 @@ void smp_generic_interrupt(struct pt_regs *regs) ...@@ -268,6 +269,7 @@ void smp_generic_interrupt(struct pt_regs *regs)
if (generic_interrupt_extension) if (generic_interrupt_extension)
generic_interrupt_extension(); generic_interrupt_extension();
run_local_timers();
irq_exit(); irq_exit();
set_irq_regs(old_regs); set_irq_regs(old_regs);
......
...@@ -198,6 +198,7 @@ void smp_reschedule_interrupt(struct pt_regs *regs) ...@@ -198,6 +198,7 @@ void smp_reschedule_interrupt(struct pt_regs *regs)
{ {
ack_APIC_irq(); ack_APIC_irq();
inc_irq_stat(irq_resched_count); inc_irq_stat(irq_resched_count);
run_local_timers();
/* /*
* KVM uses this interrupt to force a cpu out of guest mode * KVM uses this interrupt to force a cpu out of guest mode
*/ */
......
...@@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle) ...@@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle)
if (!inidle && !ts->inidle) if (!inidle && !ts->inidle)
goto end; goto end;
/*
* Set ts->inidle unconditionally. Even if the system did not
* switch to NOHZ mode the cpu frequency governers rely on the
* update of the idle time accounting in tick_nohz_start_idle().
*/
ts->inidle = 1;
now = tick_nohz_start_idle(ts); now = tick_nohz_start_idle(ts);
/* /*
...@@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle) ...@@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle)
if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
goto end; goto end;
ts->inidle = 1;
if (need_resched()) if (need_resched())
goto end; goto end;
......
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