[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xen-cvs
Subject:    [Xen-changelog] [xen-unstable] cpuidle: Fix for timer_deadline==0
From:       Xen patchbot-unstable <patchbot-unstable () lists ! xensource ! com>
Date:       2009-04-30 13:40:14
Message-ID: 200904301340.n3UDeFQn015103 () xenbits ! xensource ! com
[Download RAW message or body]

# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1241082300 -3600
# Node ID ecf6277e0f6600f8537b1f3b616a06f28ed41484
# Parent  54dbd70406ad9b303505380fb893d1b3c928267b
cpuidle: Fix for timer_deadline==0 case

After the scheduler timer became suspended before entering cpu idle
state, the percpu timer_deadline is possible to be 0, i.e. no soft
timer in the queue. This case will cause unexpected large residency
percentage in C1 for the purely idle cpu.

Signed-off-by: Wei Gang <gang.wei@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
---
 xen/arch/x86/hpet.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff -r 54dbd70406ad -r ecf6277e0f66 xen/arch/x86/hpet.c
--- a/xen/arch/x86/hpet.c	Thu Apr 30 09:43:29 2009 +0100
+++ b/xen/arch/x86/hpet.c	Thu Apr 30 10:05:00 2009 +0100
@@ -25,7 +25,7 @@
 #define HPET_EVT_USED_BIT    0
 #define HPET_EVT_USED       (1 << HPET_EVT_USED_BIT)
 #define HPET_EVT_DISABLE_BIT 1
-#define HPET_EVT_DISALBE    (1 << HPET_EVT_DISABLE_BIT)
+#define HPET_EVT_DISABLE    (1 << HPET_EVT_DISABLE_BIT)
 
 struct hpet_event_channel
 {
@@ -119,12 +119,12 @@ static int reprogram_hpet_evt_channel(
     int64_t delta;
     int ret;
 
-    if ( ch->flags & HPET_EVT_DISALBE )
+    if ( (ch->flags & HPET_EVT_DISABLE) || (expire == 0) )
         return 0;
 
     if ( unlikely(expire < 0) )
     {
-        printk(KERN_DEBUG "reprogram: expire < 0\n");
+        printk(KERN_DEBUG "reprogram: expire <= 0\n");
         return -ETIME;
     }
 
@@ -560,7 +560,7 @@ void hpet_broadcast_init(void)
         return;
     }
 
-    if ( legacy_hpet_event.flags & HPET_EVT_DISALBE )
+    if ( legacy_hpet_event.flags & HPET_EVT_DISABLE )
         return;
 
     hpet_id = hpet_read32(HPET_ID);
@@ -603,7 +603,7 @@ void hpet_disable_legacy_broadcast(void)
 
     spin_lock_irq(&legacy_hpet_event.lock);
 
-    legacy_hpet_event.flags |= HPET_EVT_DISALBE;
+    legacy_hpet_event.flags |= HPET_EVT_DISABLE;
 
     /* disable HPET T0 */
     cfg = hpet_read32(HPET_T0_CFG);
@@ -624,6 +624,9 @@ void hpet_broadcast_enter(void)
 {
     int cpu = smp_processor_id();
     struct hpet_event_channel *ch = per_cpu(cpu_bc_channel, cpu);
+
+    if ( this_cpu(timer_deadline) == 0 )
+        return;
 
     if ( !ch )
         ch = hpet_get_channel(cpu);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic