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
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user