|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] [PATCH] cpuidle: Fix for timer_deadline==0 case
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.
The fix is if timer_deadline == 0, skip most hpet broadcast enter logic because
no broadcast is needed for this cpu. Meanwhile strengthen the check in
reprogram_hpet_evt_channel, treating (expire <= 0) as a hint for no need to
reprogram hpet.
Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>
diff -r f734a724902b xen/arch/x86/hpet.c
--- a/xen/arch/x86/hpet.c Mon Apr 27 18:59:56 2009 +0100
+++ b/xen/arch/x86/hpet.c Thu Apr 30 14:45:01 2009 +0800
@@ -122,10 +122,10 @@ static int reprogram_hpet_evt_channel(
if ( ch->flags & HPET_EVT_DISALBE )
return 0;
- if ( unlikely(expire < 0) )
+ if ( unlikely(expire <= 0) )
{
- printk(KERN_DEBUG "reprogram: expire < 0\n");
- return -ETIME;
+ printk(KERN_DEBUG "reprogram: expire <= 0\n");
+ return 0;
}
delta = expire - now;
@@ -625,6 +625,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);
BUG_ON( !ch );
Jimmy
fix-long-c1-on-pure-idle-cpu.patch
Description: fix-long-c1-on-pure-idle-cpu.patch
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-devel] [PATCH] cpuidle: Fix for timer_deadline==0 case,
Wei, Gang <=
|
|
|
|
|