]> Zhao Yanbai Git Server - minix.git/commitdiff
APIC timer needs rearming before halting the cpu
authorTomas Hruby <tom@minix3.org>
Wed, 11 May 2011 09:54:23 +0000 (11:54 +0200)
committerTomas Hruby <tom@minix3.org>
Wed, 11 May 2011 09:54:23 +0000 (11:54 +0200)
- time stops if there is no activity and the timer expired before
  we halted the cpu

- restart_local_timer() checks if the timer has expired and if so it
  restarts it

- we do the same when switching back to userspace

kernel/proc.c

index fa374f12b72dc0d84bb49b0a42e9d35596968921..f14b518efe34b64d29c96fa25a80d6494a8d200f 100644 (file)
@@ -206,11 +206,19 @@ PRIVATE void idle(void)
        switch_address_space_idle();
 
 #ifdef CONFIG_SMP
+       get_cpulocal_var(cpu_is_idle) = 1;
        /* we don't need to keep time on APs as it is handled on the BSP */
        if (cpuid != bsp_cpu_id)
                stop_local_timer();
-       get_cpulocal_var(cpu_is_idle) = 1;
+       else
 #endif
+       {
+               /*
+                * If the timer has expired while in kernel we must
+                * rearm it before we go to sleep
+                */
+               restart_local_timer();
+       }
 
        /* start accounting for the idle time */
        context_stop(proc_addr(KERNEL));