[IA64] wire up pselect, ppoll
[powerpc.git] / arch / ia64 / kernel / time.c
index 62e07f9..39e0cd3 100644 (file)
@@ -45,7 +45,7 @@ static struct time_interpolator itc_interpolator = {
 };
 
 static irqreturn_t
-timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
+timer_interrupt (int irq, void *dev_id)
 {
        unsigned long new_itm;
 
@@ -53,7 +53,7 @@ timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                return IRQ_HANDLED;
        }
 
-       platform_timer_interrupt(irq, dev_id, regs);
+       platform_timer_interrupt(irq, dev_id);
 
        new_itm = local_cpu_data->itm_next;
 
@@ -61,10 +61,10 @@ timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                printk(KERN_ERR "Oops: timer tick before it's due (itc=%lx,itm=%lx)\n",
                       ia64_get_itc(), new_itm);
 
-       profile_tick(CPU_PROFILING, regs);
+       profile_tick(CPU_PROFILING);
 
        while (1) {
-               update_process_times(user_mode(regs));
+               update_process_times(user_mode(get_irq_regs()));
 
                new_itm += local_cpu_data->itm_delta;
 
@@ -84,6 +84,12 @@ timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
 
                if (time_after(new_itm, ia64_get_itc()))
                        break;
+
+               /*
+                * Allow IPIs to interrupt the timer loop.
+                */
+               local_irq_enable();
+               local_irq_disable();
        }
 
        do {