|
@@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs)
|
|
|
* some CPUs will continuue to take decrementer exceptions */
|
|
|
set_dec(DECREMENTER_MAX);
|
|
|
|
|
|
-#ifdef CONFIG_PPC32
|
|
|
+#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)
|
|
|
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
|
|
do_IRQ(regs);
|
|
|
#endif
|
|
|
|
|
|
- now = get_tb_or_rtc();
|
|
|
- if (now < decrementer->next_tb) {
|
|
|
- /* not time for this event yet */
|
|
|
- now = decrementer->next_tb - now;
|
|
|
- if (now <= DECREMENTER_MAX)
|
|
|
- set_dec((int)now);
|
|
|
- trace_timer_interrupt_exit(regs);
|
|
|
- return;
|
|
|
- }
|
|
|
old_regs = set_irq_regs(regs);
|
|
|
irq_enter();
|
|
|
|
|
@@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs)
|
|
|
get_lppaca()->int_dword.fields.decr_int = 0;
|
|
|
#endif
|
|
|
|
|
|
- if (evt->event_handler)
|
|
|
- evt->event_handler(evt);
|
|
|
+ now = get_tb_or_rtc();
|
|
|
+ if (now >= decrementer->next_tb) {
|
|
|
+ decrementer->next_tb = ~(u64)0;
|
|
|
+ if (evt->event_handler)
|
|
|
+ evt->event_handler(evt);
|
|
|
+ } else {
|
|
|
+ now = decrementer->next_tb - now;
|
|
|
+ if (now <= DECREMENTER_MAX)
|
|
|
+ set_dec((int)now);
|
|
|
+ }
|
|
|
|
|
|
#ifdef CONFIG_PPC_ISERIES
|
|
|
if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
|